本文分析在 postgresql 發生的一例死鎖問題
表結構和資料
事物隔離級别:讀已送出
死鎖發生的序列
該問題是典型的 postgresql 死鎖問題
問題的原因是資料庫會話間對資料庫對象的循環上鎖在成的
postgresql 的自動死鎖檢測機制能發現這類循環鎖定,解決方法是一旦發生可能的死鎖,就強制復原可能造成死鎖的會話的事物
使用者在開發應用的過程中需要在特别注意上鎖的順序,否則在并發修改資料時容易造成死鎖,導緻性能低下
上述用例,如果所有回話加鎖的順序都是從小的 id 到大的 id,則不會發生死鎖
同時,也可以使用意向鎖來提前鎖定需要修改的資料
<a href="https://www.postgresql.org/docs/9.3/static/explicit-locking.html">deadlocks</a>
<a href="https://www.postgresql.org/docs/9.3/static/sql-select.html">select for update</a>