我對讀PostgreSQL死鎖有點困惑。PostgreSQL在運行UPDATE時出現死鎖
一個典型的僵局例子是:
-- Transaction 1
UPDATE customer SET ... WHERE id = 1
UPDATE customer SET ... WHERE id = 2
-- Transaction 2
UPDATE customer SET ... WHERE id = 2
UPDATE customer SET ... WHERE id = 1
但如果我更改代碼如下:
-- Transaction 1
UPDATE customer SET ... WHERE id IN (1, 2)
-- Transaction 2
UPDATE customer SET ... WHERE id IN (1, 2)
將被死鎖在這裏的可能性?
本質上我的問題是:在第二種情況下PostgreSQL會逐一鎖定行,還是鎖定WHERE
條件所涵蓋的整個範圍?
在此先感謝!
謝謝! 所以我上面的例子可能會導致死鎖(因爲我們不知道在兩個事務中處理行的順序)? – vyakhir 2012-04-20 12:32:17
這可能會導致僵局,儘管這很少見;與第一個例子(明確地選擇不同的順序)相反,它將是常見的。您可以通過在更新表的每個事務期間採取適當強度的表級鎖來排除死鎖,但是這種治療可能比疾病更糟。有關詳細信息,請參閱參考文檔部分。 – kgrittn 2012-04-20 12:49:16
但行更新後PostgreSQL發佈鎖定,但整個UPDATE語句尚未完成? 換句話說,如果我們有一個像 更新...在哪裏ID IN(1,2,3,4,5) 後postgresql更新,比如行id = 2,它會釋放行id = 1嗎?如果是的話,如何在必要時將行回滾? – vyakhir 2012-04-20 13:10:18