PostgreSQL 如何实现 REPEATABLE_READ 隔离级别?

How does PostgreSQL implement the REPEATABLE_READ isolation level?

PostgreSQL 12 的REPEATABLE_READ事务隔离级别可以防止脏读、不可重复读和幻读。与 READ_COMMITTED 隔离级别相比,REPEATABLE_READ 隔离级别可防止不可重复读取和幻读。

我想这是有代价的,否则只会让两者相等。 postgres如何保证不会出现这3种读取现象?

READ COMMITTEDREPEATABLE READ 使用相同的技术:快照 确定 table 中行的哪个版本一个交易可以看到。不同的是READ COMMITTED,快照是在每条语句开始时拍摄的,这样每个新语句都可以看到之前提交的所有内容,而REPEATABLE READ事务对所有的都使用相同的快照声明。

有两种后果:

  • 如果有的话,REPEATABLE READREAD COMMITTED 便宜,因为它需要更少的快照

  • REPEATABLE READ 提供比 SQL 标准要求更高的隔离——数据库似乎根本没有改变

您为REPEATABLE READ支付的价格不同:

  • 您有序列化错误的风险,这会迫使您重复交易

  • VACUUM 无法清除在 REPEATABLE READ 事务开始后标记为无效的行