Postgresql

沒有顯式鎖定的postgres死鎖

  • April 16, 2013

我使用 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 的行上的更新。 .

引用自:https://dba.stackexchange.com/questions/40143