PostgreSQL 如何实现 REPEATABLE_READ 隔离级别?
How does PostgreSQL implement the REPEATABLE_READ isolation level?
PostgreSQL 12 的REPEATABLE_READ事务隔离级别可以防止脏读、不可重复读和幻读。与 READ_COMMITTED 隔离级别相比,REPEATABLE_READ 隔离级别可防止不可重复读取和幻读。
我想这是有代价的,否则只会让两者相等。 postgres如何保证不会出现这3种读取现象?
READ COMMITTED
和 REPEATABLE READ
使用相同的技术:快照 确定 table 中行的哪个版本一个交易可以看到。不同的是READ COMMITTED
,快照是在每条语句开始时拍摄的,这样每个新语句都可以看到之前提交的所有内容,而REPEATABLE READ
事务对所有的都使用相同的快照声明。
有两种后果:
如果有的话,REPEATABLE READ
比 READ COMMITTED
便宜,因为它需要更少的快照
REPEATABLE READ
提供比 SQL 标准要求更高的隔离——数据库似乎根本没有改变
您为REPEATABLE READ
支付的价格不同:
您有序列化错误的风险,这会迫使您重复交易
VACUUM
无法清除在 REPEATABLE READ
事务开始后标记为无效的行
PostgreSQL 12 的REPEATABLE_READ事务隔离级别可以防止脏读、不可重复读和幻读。与 READ_COMMITTED 隔离级别相比,REPEATABLE_READ 隔离级别可防止不可重复读取和幻读。
我想这是有代价的,否则只会让两者相等。 postgres如何保证不会出现这3种读取现象?
READ COMMITTED
和 REPEATABLE READ
使用相同的技术:快照 确定 table 中行的哪个版本一个交易可以看到。不同的是READ COMMITTED
,快照是在每条语句开始时拍摄的,这样每个新语句都可以看到之前提交的所有内容,而REPEATABLE READ
事务对所有的都使用相同的快照声明。
有两种后果:
如果有的话,
REPEATABLE READ
比READ COMMITTED
便宜,因为它需要更少的快照REPEATABLE READ
提供比 SQL 标准要求更高的隔离——数据库似乎根本没有改变
您为REPEATABLE READ
支付的价格不同:
您有序列化错误的风险,这会迫使您重复交易
VACUUM
无法清除在REPEATABLE READ
事务开始后标记为无效的行