PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUG PG技术大讲堂。
第20讲:事务概述与隔离级别
内容1:ACID四大特性
内容2:PostgreSQL事务隔离级别
内容3:MVCC介绍
内容4:Clog与事务状态
内容5:事务快照
内容6:可重复读隔离级别特点
内容7:读提交隔离级别特点
内容8:可串行化隔离级别特点
ACID概述
· ACID四大特性:
--> Atomicity(原子性):一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。
--> Consistency(一致性):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的数据必须完全符合所有的预设规则,这包含数据的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
--> Isolation(隔离性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
--> Durability(持久性):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
PostgreSQL支持的事务隔离级别
· 下表描述了PostgreSQL实现的事务隔离级别
MVCC概述
· 事务id(txid)
并发控制是一种在数据库中并发运行多个事务时保持一致性和隔离性的机制,这是ACID的两个属性。
并发控制技术:
--> 多版本并发控制(MVCC)
--> 严格的两阶段锁(S2PL)
--> 乐观并发控制(OCC)
· MVCC特点
每次写操作都会创建数据项的新版本,同时保留旧版本。当事务读取一个数据项时,系统会选择其中一个版本以确保单个事务的隔离。MVCC的主要优点是“读不阻止写,写不阻止读,相反,例如,基于S2PL的系统必须在写卡器写入项时阻止读卡器,因为写卡器获取项的独占锁。PostgreSQL和一些rdbms使用MVCC的一个变体,称为快照隔离(Snapshot Isolation,SI)。
MVCC实现对比
· 事务id(txid)
PostgreSQL通过应用可见性检查规则来选择项目的适当版本
由于PostgreSQL数据块中包含了未删除和已删除的行的数据,所以在读取数据块中行的时候,需要一套规则来判断哪些行能够被哪些事务所看得见,我们成为行可见性规则
Oracle使用回滚段来选择项目的适当版本
Oracle专门创建了一个回滚表空间,用来存放修改前的行的数据,而表的数据块中没有包含删除行的数据,所以不需要行可见性规则来判断。
事务状态
· Transaction Status
四种事务状态:
--> IN_PROGRESS
--> COMMITTED
--> ABORTED
--> SUB_COMMITTED
Commit Log
· Clog 工作原理
事务快照
· 内置函数txid_current_snapshot及其文本表示格式
testdb=# SELECT txid_current_snapshot();
txid_current_snapshot
-----------------------
100:104:100,102
(1 row)
· txid_current_snapshot的文本表示为“xmin:xmax:xip_list”,组件描述如下
Xmin:最早仍在活动的txid。所有以前的事务要么提交并可见,要么回滚并停止。
Xmax:第一个尚未分配的txid。截至快照时,所有大于或等于此值的txid尚未启动,因此不可见。
xip_list:快照时的活动txid。该列表仅包含xmin和xmax之间的活动txid。
例如,在快照'100:104:100,102'中,xmin是'100',xmax是'104',xip_list是'100,102'。
· Examples of transaction snapshot representation
事务管理器
· 不同隔离级别的事务快照状态
并发UPDATE时
防止更新的数据丢失
· 并发UPDATE操作,隔离级别不同如何保护已修改的数据不丢失
1)如果A事务回滚,则b事务能够更新成功
2)B事务如果查询了表,则再次更新时失败,如果没有,则会更新成功
防止更新的数据丢失
· 读提交事务隔离级别(事务A和B同时修改同一行)
· 可重复读事务隔离级别(事务A和B同时修改同一行)
· 可重复读事务隔离级别(事务B在提交前执行了查询)
· 可重复读事务隔离级别(事务B在提交前没有执行查询)
可串行化快照隔离
· SSI(可串行化快照隔离)实施的基本策略
写入倾斜计划及其优先级图
· 在PostgreSQL中实现SSI
SIREAD locks:SIREAD锁在内部称为谓词锁,三个部分组成,由一对对象和(虚拟)txid 组成。
rw-conflicts:rw-conflicts是SIREAD锁的三个组成部分中的一个和读写SIREAD锁的两个txid
· SSI 怎样造成的
事务提交失败的原因是要保护事务A修改的结果,因为事务B是在可串行化事务隔离级别,所以无法看到事务A修改后的结果
· 其它造成的场景
注意事务提交的不同顺序
· 假阳性可串行化快照隔离异常
两个事务分别查询和更新各自的行,所以不会影响,都能够提交成功。
· 假阳性可串行化快照隔离异常(1) – Using sequential scan
表没有索引,导致顺序扫描,两个事务操作时发生交叉访问同一个块
· 假阳性可串行化快照隔离异常(2) – Index scan using the same index page
如果表比较小,导致root和leaf索引块同属于一个块,两个事务也发生交叉访问同一个索引块
· 假阳性可串行化快照隔离异常(3) – Index scan using the difference index page
插入新数据,导致root和leaf索引块不属于一个块,不会造成交叉访问
以上就是 第20讲- 事务与隔离级别 的内容,欢迎一起探讨交流,往期视频,联系cuug