PostgreSQL 如何实现 REPEATABLE_READ 隔离级别?

Mar*_*oma 6 sql postgresql transaction-isolation

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

我想这是有代价的,否则就会使两者平等。postgres如何保证这3种读现象不会发生?

Lau*_*lbe 12

READ COMMITTED并且REPEATABLE READ使用相同的技术:确定事务可以看到表中行的哪个版本的快照。不同之处在于READ COMMITTED,使用 时,快照是在每个语句开始时拍摄的,以便每个新语句都可以看到之前已提交的所有内容,而事务REPEATABLE READ对所有语句使用相同的快照。

\n

有两个后果:

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

    \n
  • \n
  • REPEATABLE READ提供比 SQL 标准所需的更高的隔离 \xe2\x80\x93 数据库似乎根本没有改变

    \n
  • \n
\n

您支付的价格REPEATABLE READ不同:

\n
    \n
  • 您面临序列化错误的风险,这迫使您重复交易

    \n
  • \n
  • VACUUMREPEATABLE READ事务开始后无法清除标记为死的行

    \n
  • \n
\n