Postgres的僵局没有明确锁定(postgres deadlock without explic

2019-08-31 08:21发布

我使用PostgreSQL 9.2,我也不在任何地方使用明确的锁定,既不LOCK语句也不SELECT ... FOR UPDATE 。 然而,最近我得到了ERROR: 40P01: deadlock detected 。 此外,将检测死锁的查询虽然包裹在事务块。 总之,是怎么来的呢?

Answer 1:

你不需要任何明确的LOCK进入一个僵局。 下面是从只是插入一个从无到有的非常简单的演示:

create table a(i int primary key);
create table b(i int primary key);

活动#1的作用:

begin;
insert into a values(1);

然后会话#2的作用:

begin;
insert into b values(1);
insert into a values(1);
-- here it goes into waiting for session #1 to finish its transaction

然后会话#1的作用:

insert into b values(1);

然后发生死锁:

错误:死锁检测
DETAIL:流程9571个等待对交易4150 ShareLock; 阻断过程9501。
过程9501个等待对交易4149 ShareLock; 阻断过程9571。
提示:请参阅服务器日志查询详细信息。

同样可以用简单的更新或更新和插入的组合发生。 这些操作都隐含锁,如果他们在不同的顺序不同的会话发生,他们可能死锁。



Answer 2:

我首先怀疑哈希索引。

  • 交换机的任何hash -Indexes你有B-tree
  • 使用Serializable ,如果它似乎是适当的隔离级别。


文章来源: postgres deadlock without explicit locking