在PostgreSQL的隔离级别留档中指出
为了保证真正的可串行性,PostgreSQL使用谓词锁,这意味着它保留锁,允许它确定写入何时会对先前从并发事务读取的结果产生影响,如果它先运行的话。在PostgreSQL中,这些锁不会导致任何阻塞,因此不会在导致死锁方面发挥任何作用。它们用于识别和标记并发Serializable事务之间的依赖关系,这些事务在某些组合中可能导致序列化异常。
当我尝试执行隔离级别SERIALIZABLE
的两个update语句时,似乎第二个写阻塞,直到第一个事务提交或中止。你可以看到gif文件爆炸的交互:
about语句如何解释这种行为?我期望第二个事务一直持续到提交,然后获取无法序列化
错误。
BTW,事件
表的模式如下:
CREATE TABLE event (
id INT,
created_at timestamp
)
该段仅描述谓词锁,谓词锁是仅用于可序列化隔离级别的特殊锁类。
除了这些特殊锁之外,可序列化事务还将采用其他隔离级别使用的“普通”锁。