聊聊PG中事务隔离级别

2023-02-26 14:45:52 浏览数 (2)

数据库中的现象
  • Lost Updates现象:两个事务同时并发更新一个行数据,第一个事务更新完毕后,第二个事务没有考虑第一个事务的任何变更而进行数据变更的问题。比如A、B事都做转账10元给X账户操作,A事务在账户X(已有1元)完成转账这时候X账户有11元,而B事务这是开始转账读取X账户的11元,在转账1元,这时候X账户有12元,整个过程客户丢失了1元
  • Dirty Reads and Read Uncommitted现象:一个事务读取另外一个事务未提交的事务的数据这个就是脏读
  • Non-Repeatable Reads and Read Committed现象:不可重复读发生在一个事务A内读取同一行数据多次,每次读取的结果都不同。这个现象是这个事务A内读取数据时候其他事务更新或者删除这一行,并且已经提交,从而导致A事务内多次读取同一行得到不同的结果
  • Phantom Reads and Repeatable Read现象:幻读一个事务A内多次执行查询表X返回一个特定的结果集合,这时候事务B在表X中新增多行数据然后提交这些变更,事务A在执行查询会发现第一次和第二次查询的结果结果结合不同
  • No Anomalies and Serializable现象:序列化是阻止脏读、不可重复度、幻读的隔离级别,也是性能最差的。
隔离级别介绍
隔离级别的简单认知
  • 如果数据库中的多行数据在更新时候会被锁定,针对read不会被锁定那么这就认为是Read Uncommited Level
  • 如果数据库中多行数据在被更新的时候读和写都被会锁定,那么我们可以认为这是Read Commited Level,在这个隔离级别中多次查询一行数据返回不同结果的现象
  • 如果锁定据库中被读取行数据和更新的行数据,这个时候可以认为是Repeatable Read Level,在这个隔离级别内一个事务内多次查询一行数据得到的结果是一样的
PG中的隔离级别
  • 数据库的隔离级别实现中离不开transaction,数据库一般实现是基于锁实现来管理事务,而在PG中采用基于snapshot isolation protocol来管理事务,PG中的snapshot包含了当前所有已经提交的变更。snapshot isolation是最小化的lock的事务管理方案,在实际实现中并发的更新同一行数据会被加锁,在其他的情况下并发执行写不阻塞读,读不需要任何锁。
  • PG中的MVCC基于snapshot isolation protocolMVCC可以做到并发操作一行数据情况下可以保存这行数据在不同时刻的多个版本。
  • PG中Read Commit是默认的隔离级别,它能够适配和满足多种应用需求。但是不会终止任何任何维护数据一致性的行为;Repeatable Read隔离隔离级别消除了数据不一致的问题,针对只读事务的选择。Serializable隔离级别是最严格的隔离级别,性能是相对较差的,但是数据一致性能得到完美的保障。

0 人点赞