数据库中的现象
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 protocol
,MVCC
可以做到并发操作一行数据情况下可以保存这行数据在不同时刻的多个版本。 - PG中
Read Commit
是默认的隔离级别,它能够适配和满足多种应用需求。但是不会终止任何任何维护数据一致性的行为;Repeatable Read
隔离隔离级别消除了数据不一致的问题,针对只读事务的选择。Serializable
隔离级别是最严格的隔离级别,性能是相对较差的,但是数据一致性能得到完美的保障。