Postgresql
沒有顯式鎖定的postgres死鎖
我使用 PostgreSQL 9.2,並且我不在任何地方使用顯式鎖定,無論是
LOCK
語句還是SELECT ... FOR UPDATE
. 但是,最近我得到了ERROR: 40P01: deadlock detected
. 但是,檢測到死鎖的查詢被包裝在事務塊中。無論如何,它是怎麼來的?
假設會話 1 執行:
begin transaction; update a set col = val where pk = 1; update a set col = val where pk = 2; commit;
並且在同一時間會話 2 做相反的事情:
begin transaction; update a set col = val where pk = 2; update a set col = val where pk = 1; commit;
然後會話 1 將等待會話 2 送出或回滾 pk = 2 的行上的更新,同時會話 2 將等待會話 1 送出或回滾 pk = 1 的行上的更新。 .