我使用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