【发布时间】:2014-01-14 04:29:23
【问题描述】:
我有两个死锁在一起的查询
PERFORM id
FROM stack
WHERE id IN (SELECT tmp.stkid FROM tmp_push_bulk tmp WHERE tmp.stkid > 0)
ORDER BY id
FOR UPDATE OF stack
和
PERFORM stk.id
FROM stack stk
WHERE stk.referer IN (
SELECT tmp.id
FROM tmp_renew_stk tmp
)
ORDER BY stk.id
FOR UPDATE OF stk
错误是:
- PG (20:46:37) [14786]: Execute command failed: ERROR: deadlock detected
DETAIL: Process 14797 waits for ShareLock on transaction 183495696; blocked by process 24303.
Process 24303 waits for ShareLock on transaction 183495704; blocked by process 14797.
HINT: See server log for query details.
我也认为每个进程都按照 id 列的顺序锁定它的行,所以死锁是不可能的。谁能告诉我为什么?
【问题讨论】:
标签: postgresql concurrency postgresql-9.2 database-deadlocks