Postgresql 博士后';s可序列化事务块并发写入
在报告中指出: 为了保证真正的可序列化性,PostgreSQL使用谓词锁定, 这意味着它保持锁,允许它确定 写操作会对以前从数据库读取的结果产生影响 并发事务,首先运行它。在PostgreSQL中,这些锁do 不会导致任何阻塞,因此不会在导致阻塞中起任何作用 僵局。它们用于标识和标记各个组件之间的依赖关系 并发可序列化事务,在某些组合中可以 导致序列化异常 当我尝试在隔离级别Postgresql 博士后';s可序列化事务块并发写入,postgresql,transactions,Postgresql,Transactions,在报告中指出: 为了保证真正的可序列化性,PostgreSQL使用谓词锁定, 这意味着它保持锁,允许它确定 写操作会对以前从数据库读取的结果产生影响 并发事务,首先运行它。在PostgreSQL中,这些锁do 不会导致任何阻塞,因此不会在导致阻塞中起任何作用 僵局。它们用于标识和标记各个组件之间的依赖关系 并发可序列化事务,在某些组合中可以 导致序列化异常 当我尝试在隔离级别SERIALIZABLE中执行两条update语句时,似乎第二条写操作会一直阻塞,直到第一个事务提交或中止。您可以看到gi
SERIALIZABLE
中执行两条update语句时,似乎第二条写操作会一直阻塞,直到第一个事务提交或中止。您可以看到gif文件中的交互:
about语句如何解释这种行为?我希望第二个事务继续进行,直到提交,然后获取无法序列化
错误
顺便说一句,事件
表的模式如下:
CREATE TABLE event (
id INT,
created_at timestamp
)
本段仅描述谓词锁,谓词锁是仅在可序列化隔离级别上使用的一类特殊锁
除了这些特殊锁之外,可序列化事务还将使用其他隔离级别使用的“普通”锁。感谢您的澄清!后续问题:这些锁定(在
SERIALIZABLE
和REPEATABLE READ
中)是否会导致死锁,或者PostgreSQL将中止其中一个死锁的事务?您可以获得死锁,但PostgreSQL将通过在等待deadlock\u timeout
秒后终止其中一个涉及的事务来解决它(默认值为1)。