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

时间:2018-06-07 15:40:47

标签: postgresql transactions

PostgreSQL's isolation levels documentation中声明

  

保证真正的可串行化PostgreSQL使用谓词锁定,   这意味着它保持锁定,允许它确定何时   写入会对先前从a读取的结果产生影响   并发事务,先运行它。在PostgreSQL中,这些锁   不会导致任何阻止因此无法发挥任何作用   陷入僵局。它们用于识别和标记其中的依赖关系   并发可序列化的事务,在某些组合中可以   导致序列化异常。

当我尝试在隔离级别SERIALIZABLE中执行两个更新语句时,看起来第二个写入会阻塞,直到第一个事务提交或中止。你可以看到他在gif文件中的交互打击:

enter image description here

about语句如何解释这种行为?我希望第二个事务继续,直到提交,然后得到could not serialize错误。

BTW,event表的架构如下:

CREATE TABLE event (
  id INT,
  created_at timestamp
)

1 个答案:

答案 0 :(得分:1)

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

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