PostgreSQL中的事务隔离

news2025/3/15 0:23:56

1. 事务隔离的概念

在数据库管理系统中,事务隔离是一项重要的功能,它能确保在并发访问数据库时事务之间能够独立运行,不会相互干扰。数据库系统通常支持不同级别的事务隔离,用来满足不同应用程序之间的需求

2. 事务隔离的种类 

常见的事务隔离的种类也一共有四种包括读未提交、已提交、可重复读和可序列化对于并发的事务,常见的一些可能发生的行为包括

  1. 脏读:一个事务读取了另一个未提交的事务写入的数据
  2. 不可重复读:一个事务重新读取了前面读取过的数据,但是该数据已经发生了改变
  3. 幻读:一个事务开始之后,需要根据数据库中现有的数据做一些更新,于是重新执行一个查询,返回符合查询条件的行,这个时候发现因为其他最近提交的事务自身发生改变,导致现有事务如果继续执行可能会发生错误。

下表代表的是不同的事务隔离级别对应的可能会发生行为的对照关系。

隔离级别

脏读

不可重复读

幻读

读未提交

可能

可能

可能

读已提交

不可能

可能

可能

重复读

不可能

不可能

可能

可串行化

不可能

不可能

不可能

PG中默认的事务隔离级别是读已提交,而读未提交相当于是读已提交的一个更弱的版本。

这是因为读已提交的隔离级别要求一个事务只能看到已经提交的数据修改,这意味着一个事务不能读取另一个事务尚未提交的数据变换。那么这种隔离级别提供了一定的数据一致性,防止脏读。这也是为什么PG中采用这种隔离级别为默认的隔离级别,因为他的适应性比较广。

而相比于读已提交,读未提交的隔离级别不要求事务等待其他事务的提交,它允许一个事务读取另一个事务尚未提交的数据变化,这种隔离级别容易导致脏读,因为一个事务可能会读取到另一个正在被修改的事务,而这些事务可能会回滚,从而导致数据状态前后不一致

并且PG中内部没有实现读未提交的隔离级别,因为读未提交的隔离级别存在严重的数据一致性问题,不符合事务的ACID特性,所以并未实现读未提交,主要还是为了确保数据库的一致性和可靠性。

2.1  读已提交

  1. PG默认事务隔离级别
  2. 事务只能看到已经提交的数据
  3. 可能会发生不可重复读和幻读

案例

首先创建一个示例表,其中包含如下的信息:

create table products(id serial primary key,name varchar(50),price numeric(10,2));

select * from products;

会话1:(读操作

begin;

select * from products where id=1;

会话2:(写操作)

begin;

update products set price =66 where id = 1;

此时回到会话1:查询id=1,发现数据还是原来的数据,

会话2:

commit;

当会话2提交以后,回到会话1,就会发现数据进行了更改

这个案例说明了在读已提交隔离级别中,一个事务只能看到其他事务已经提交的数据修改,如果事务未提交,那么对于查询事务来说,这些修改是不可见的,直到其他事务提交为止

2.2 可重复读

  1. 保证在同一事务内的查询不会受到其他事务的影响
  2. 防止不可重复读,但是仍然可能发生幻读
  3. 适用场景:需要一定程度的数据一致性,可以容忍轻微的幻读。

案例

沿用上面的products表的数据,将修改的数据修改回原样。

会话1:

begin isolation level repeatable read ;

select * from products where id =1;

会话2:

此时会话2.执行更新语句,但不提交,在会话1中查看数据。

会话2:

对事务进行提交,再在事务1中查询对应的数据

可以发现,在会话1中,无论会话2提不提交,查询的结果都保持不变,即使会话2提交更新操作,查询结果仍然不变。

此时,除非对会话1也进行提交,才可以看到改动就相当于在事务的一开始对数据进行了快照,无论如何改动,都不影响读取的结果。

2.3 串行化

  1. 最高级别的隔离,确保事务之间没有任何的交错或者是并发问题
  2. 通过锁定数据来实现,防止任何形式的并发问题,包括脏读、不可重复读、幻读
  3. 性能最差,因为他几乎完全禁止并发
  4. 适用场景:对数据一致性要求非常高,可以容忍较低的性能.
  5. 事务2会进行回滚,提交失败以后,事务的回滚其实就相当于没有执行

案例:

会话1:

开始串行化隔离,插入一条新的数据,查询现在的价格

会话2;

执行与会话1同样的操作,其中开启事务的语句是同时执行的,然后再分别插入数据。

可以看到,两个会话中插入的语句只有在自己的事务中才可以查看到

此时将会话1事务进行提交,然后将会话2事务进行提交,可以看到,会话1提交成功,而会话2会失败,且会话2中的事务发生了回滚,舍弃了之前的插入操作,

重新查询两个会话中表的信息发现只能查询到会话1提交的事务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2311284.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android15请求动态申请存储权限完整示例

效果: 1.修改AndroidManifest.xml增加如下内容: <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-perm

unity学习62,尝试做第一个小游戏项目:flappy bird

目录 学习参考 1 创建1个unity 2D项目 1.1 2D项目模板选择 1.1.1 2D(built-in-Render pipeline) 1.1.2 universe 2D 1.1.3 这次选择 2D(built-in-Render pipeline) 1.2 创建项目 1.2.1 注意点 1.2.2 如果想修改项目名 2 导入美术资源包 2.1 下载一个flappy bird的…

【STM32F103ZET6——库函数】11.捕获红外信号

目录 红外原理 数据码 引导码 连发码 配置捕获引脚 使能引脚时钟 配置定时器 使能定时器时钟 配置输入捕获 中断优先级分组 配置定时器4中断 定时器中断使能 使能定时器 重写定时器中断服务函数 清空定时器中断标志位 例程 例程说明 main.h main.c HongWai…

unity调用本地部署deepseek全流程

unity调用本地部署deepseek全流程 deepseek本地部署 安装Ollama 搜索并打开Ollama官网[Ollama](https://ollama.com/download) 点击Download下载对应版本 下载后点击直接安装 安装deepseek大语言模型 官网选择Models 选择deepseek-r1&#xff0c;选择对应的模型&#xff0…

AI绘画软件Stable Diffusion详解教程(6):文生图、提示词细说与绘图案例

文生图即以文字描述来生成图像&#xff0c;这是目前所有AI绘画软件的基本功能之一。要想画一副好的图片&#xff0c;除了选择好的模型&#xff0c;在文生图中&#xff0c;提示词特别关键。 一、什么是提示词&#xff08;Prompt&#xff09; 提示词又称创意、关键词、咒语、ca…

SAP监控体系和机制

SAP监控体系 SAP监控体系是一个多层次、多维度的综合系统&#xff0c;旨在确保SAP系统的性能、可用性、安全性和稳定性。以下是SAP监控体系的主要组成部分&#xff1a; 1. 技术监控&#xff08;Technical Monitoring&#xff09; 目标&#xff1a;监控SAP系统的基础设施和技术…

SLAM评估工具安装及使用EVO(Ubuntu20.04安装evo)--缺少 onnx 库还有Pandas 版本不兼容解决

介绍一下我的是ubuntu20.04.机载电脑是orinnx&#xff0c;通过源码烧写的系统。 首先打开终端&#xff0c;输入 pip install evo --upgrade --no-binary evo 安装过程中出现如下问题 缺少 onnx 库还有Pandas 版本不兼容&#xff0c; ONNX&#xff08;Open Neural Network E…

【YashanDB认证】yashandb23.3.1 个人版单机部署安装实践

YCA报名链接如下: YashanDB|崖山数据库系统YashanDB学习中心-YCA认证详情 目前免费 主要参考文档&#xff1a; 单机&#xff08;主备&#xff09;部署 | YashanDB Doc 另外还参考摩天轮文章&#xff1a; YashanDB 23.2.9.101 企业版安装步骤抢先看&#xff01; - 墨天轮 …

ProfibusDP主站转ModbusTCP网关如何进行数据互换

ProfibusDP主站转ModbusTCP网关如何进行数据互换 在现代工业自动化领域&#xff0c;通信协议的多样性和复杂性不断增加。Profibus DP作为一种经典的现场总线标准&#xff0c;广泛应用于工业控制网络中&#xff1b;而Modbus TCP作为基于以太网的通信协议&#xff0c;因其简单易…

正点原子[第三期]Arm(iMX6U)Linux移植学习笔记-2.1 uboot简介

前言&#xff1a; 本文是根据哔哩哔哩网站上“Arm(iMX6U)Linux系统移植和根文件系统构键篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。 引用&#xff1a; …

Qt 实现绘图板(支持橡皮擦与 Ctrl+Z 撤销功能)[特殊字符]

作业&#xff1a; 1&#xff1a;实现绘图的时候&#xff0c;颜色的随时调整 2&#xff1a;追加橡皮擦功能 3&#xff1a;配合键盘事件&#xff0c;实现功能 当键盘按 ctrlz的时候&#xff0c;撤销最后一次绘图 头文件.h #ifndef WIDGET_H #define WIDGET_H#include <QWidge…

基于STM32的智能家居蓝牙系统(论文+源码)

1总体方案设计 本次基于STM32的智能家居蓝牙系统&#xff0c;其系统总体架构如图2.1所示&#xff0c;采用STM32f103单片机作为控制器&#xff0c;通过DHT11传感器实现温湿度检测&#xff0c;MQ-2烟雾传感器实现烟雾检测&#xff0c;光敏电阻实现光照检测&#xff0c;同时将数据…

el-table一格两行;概率;find

样式&#xff1a; 根据概率表头关键代码&#xff1a;rateRanges&#xff1b; scope.row.targetHitTable.find((target:any) > target.targetHitRate > range.min && target.targetHitRate < range.max)!.targetHitNum &#xff08;1&#xff09;!.是TypeScri…

前端跨域设置 withCredentials: true

在做登录认证的时候&#xff0c;会出现请求未登录的情况&#xff0c;查看请求头的时候发现并没有把登录时的cookie设置到第二次的请求头里面。查看资料才知道跨域请求要想带上cookie&#xff0c;必须要在ajax请求里加上 withCredentials: true 再次访问发现请求头可以携带cook…

私有云基础架构与运维(一)

私有云基础架构与运维&#xff08;OpenStackopenEuler版&#xff09; 项目一.OpenStack 云计算基础架构平台概述 任务1.1 安装部署虚拟化环境 通过安装 openEuler-22.09 操作系统来熟悉虚拟机的安装&#xff0c;在操作过程中熟悉计算机虚 拟化资源的分配管理。 1.1.1 VMware…

PySide(PyQT)的视图(QGraphicsView)范例(一) 基本框架

最近学习了视图&#xff08;QGraphicsView&#xff09;的知识&#xff0c;总结一下&#xff0c;做一个demo以备忘。在demo中演示了常用的设置方法和信号槽传递机制。 QT的视图&#xff08;QGraphicsView&#xff09;体系是建立在场景&#xff08;QGraphicsScene&#xff09;基础…

深入理解seata使用和源码分析

一、数据库事务ACID特性 基础概念:事务ACID A(Atomic):原子性,构成事务的所有操作,要么都执行完成,要么全部不执行,不可能出现部分成功部分失 败的情况。C(Consistency):一致性,在事务执行前后,数据库的一致性约束没有被破坏。比如:张三向李四转100元, 转账前和…

centos8更换阿里云yum源

1.centos8更换为阿里云yum源 2.更换阿里云Yum-centos8源 mv /etc/yum.repos.d/CentOS-Stream-BaseOS.repo /etc/yum.repos.d/CentOS-Stream-BaseOS.repo.backupcurl -o /etc/yum.repos.d/CentOS-Stream-BaseOS.repo https://mirrors.aliyun.com/repo/Centos-8.repowget -O /et…

单粒子翻转对FPGA的影响及解决方法

1 单粒子翻转对FPGA 的影响 对于在轨的空间应用而言,需要考虑外太空辐射对电子元器件带来的影响,包括单粒子翻转(Single Event Upset,SEU)、多粒子翻转(Multiple Bit Upset,MBU)、单粒子瞬态效应(Single Event Transient,SET)、单粒子功能中断(SingleEvent Functi…

基于Python Django的人脸识别上课考勤系统(附源码,部署)

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…