提问者:小点点

Postgres的可序列化事务阻止并发写入


在PostgreSQL的隔离级别留档中指出

为了保证真正的可串行性,PostgreSQL使用谓词锁,这意味着它保留锁,允许它确定写入何时会对先前从并发事务读取的结果产生影响,如果它先运行的话。在PostgreSQL中,这些锁不会导致任何阻塞,因此不会在导致死锁方面发挥任何作用。它们用于识别和标记并发Serializable事务之间的依赖关系,这些事务在某些组合中可能导致序列化异常。

当我尝试执行隔离级别SERIALIZABLE的两个update语句时,似乎第二个写阻塞,直到第一个事务提交或中止。你可以看到gif文件爆炸的交互:

about语句如何解释这种行为?我期望第二个事务一直持续到提交,然后获取无法序列化错误。

BTW,事件表的模式如下:

CREATE TABLE event (
  id INT,
  created_at timestamp
)

共1个答案

匿名用户

该段仅描述谓词锁,谓词锁是仅用于可序列化隔离级别的特殊锁类。

除了这些特殊锁之外,可序列化事务还将采用其他隔离级别使用的“普通”锁。