postgreSQL事务机制

事务的 ACID 特性是数据库管理系统中确保数据可靠性和一致性的基本属性,这四个特性分别是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)

原子性:
指事务是一个不可分割的操作单元,事务中的所有操作要么全部成功执行,要么全部失败回滚。
PG 数据库使用预写式日志(Write-Ahead Logging,WAL)来保证原子性。当一个事务开始执行时,所有对数据的修改操作首先会被记录到 WAL 日志中,而不是直接写入数据文件。
操作过程:在事务执行过程中,每一个修改操作(如插入、更新、删除)都会生成相应的日志记录。如果事务执行成功并提交,这些日志记录会被标记为已提交;如果事务执行过程中出现错误,数据库会根据 WAL 日志进行回滚操作,将数据恢复到事务开始前的状态。

一致性:
表示事务执行前后,数据库的数据必须始终保持在一个合法的状态。也就是说,事务的执行不会破坏数据库的完整性约束,如主键约束、唯一约束、外键约束等。
约束检查:PG 数据库支持多种约束,如主键约束、唯一约束、外键约束、检查约束等。在事务执行过程中,数据库会在执行每一个修改操作时检查这些约束条件是否满足。如果不满足,数据库会拒绝该操作,从而保证数据的一致性。

隔离性:
指多个事务并发执行时,一个事务的执行不能被其他事务干扰,每个事务都感觉好像是在独立执行一样。不同的隔离级别决定了事务之间的隔离程度。
多版本并发控制(MVCC):PG 数据库使用 MVCC 来实现读写操作的并发执行,避免读写冲突。MVCC 通过为数据的每个版本保留一个快照,使得读操作可以读取到在该事务开始时数据库的一个一致性快照,而不会受到其他并发事务的影响。

锁机制:除了 MVCC,PG 数据库还提供了多种锁机制,如行级锁、表级锁等,用于处理并发事务之间的写冲突。
示例:当一个事务需要对某一行数据进行更新操作时,它会对该行数据加行级锁,防止其他事务同时对该行数据进行修改。

持久性:
意味着一旦事务成功提交,它对数据库所做的修改就会永久保存,即使在系统崩溃或发生故障的情况下,数据也不会丢失
预写式日志(WAL):WAL 不仅用于保证原子性,还用于保证持久性。当一个事务提交时,数据库会确保该事务的所有 WAL 日志记录都已经被写入磁盘。即使在事务提交后数据库发生崩溃,在重启时,数据库可以根据 WAL 日志将未完成的事务重新应用到数据文件中,保证数据的持久性。

事务的隔离级别:
隔离级别 脏读 不可重复读 幻读 使用场景
未提交读(read uncommitted) 可能 可能 可能
提交读(read committed) 不可能 可能 可能 常规场景
可重复读(repeatable read) 不可能 不可能 可能 需要视图一致性
串行读(serializable) 不可能 不可能 不可能 金融场景

PostgreSQL可实现了三种隔离级别——未提交读和提交读实际上都被实现为提交读
默认的级别是read committed

MVCC实现方式:每个数据行都有隐藏的 xmin 和 xmax 字段,分别记录插入该行的事务 ID 和删除或更新该行的事务 ID。

MVCC提交读 - 提交读只可读取其它已提交事务的结果。PostgreSQL中通过pg_clog来记录哪些事务已经被提交,哪些未被提交。

MVCC可重复读 - 相对于提交读,重复读要求在同一事务中,前后两次带条件查询所得到的结果集相同。实际中,PostgreSQL的实现更严格,不仅要求可重复读,还不允许出现幻读。它是通过只读取在当前事务开启之前已经提交的数据实现的。
MVCC和锁机制不冲突,MVCC可以保证读和读,读和写可以并发,但是写和写还是需要加锁的

查询级别:
SHOW TRANSACTION ISOLATION LEVEL;
修改:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容