2010-07-07 69 views
1

假設我想實現一個帶有鎖定系統的數據庫,並且我使用鎖定避免並在獲取它之前儘量避免潛在的死鎖。當檢測到死鎖時會發生什麼

我的問題是:

當會話/事務已經成功地收購一些資源A,現在它試圖獲取對資源B的鎖,檢測到死鎖時。

因此,如果系統強制會話放棄會話持有的其他資源(在本例中爲A),並且使會話失效,會話將無法獲得B上的鎖定?

或者還有其他更標準的方法來處理這種情況?

+3

「說我想實現一個數據庫與鎖系統」 - 這是一個高難度的訂單.... – 2010-07-07 14:46:01

+1

我實際上並沒有這樣做,不用擔心^^ – Viele 2010-07-07 15:26:32

回答

4

解決衝突(死鎖)事務的常用方法是回滾其中一個事務並稍後重試(在另一個事務釋放了這兩個鎖之後)。

但是,如果事務是以某種編程語言打開的,則數據庫無法從事務開始時重新運行所有代碼;所以它只能告訴應用程序存在死鎖。應用程序開發人員必須編寫代碼以重試整個事務。

請注意,如果應用程序正在使用諸如Software Transactional Memory之類的應用程序,則應用程序可能會集成到數據庫事務中,並自動回滾應用程序狀態並重試整個事務。

+0

嗨丹尼爾,你可以詳細說明如何整合STM與數據庫事務?我真的很感興趣。 – Viele 2010-07-09 14:47:58

0

如果檢測到死鎖,則提示錯誤以指示程序員應更改其模型。

1

SQL Server處理與您描述的方式類似的死鎖 - 它將選擇2個會話中的一個作爲死鎖受害者並終止/使會話無效。