2010-01-29 102 views
4

我有一個遭受數據庫死鎖的集羣應用程序。如何避免數據庫死鎖

這是一個使用JPA和hibernate的j2ee應用程序。數據庫是Z/OS上的DB2 8.1被設置爲頁面鎖定(這是公司的一項要求)。

問題是主鍵是作爲一個序列生成的,並且在嘗試插入記錄時通常會死鎖,如果系統有任何重大負載。

是否有減少死鎖概率的「最佳實踐」?

+0

後續操作:執行隨機數建議後,死鎖率大幅下降。感謝所有的幫助。 – Jesse 2010-02-08 20:54:23

回答

6

「是否有任何」最佳實踐「來減少死鎖的可能性?」

死鎖意味着2個(或更多)進程,2個(或更多)資源和兩個不同的訪問命令。

過程1具有獲得A和B

過程2具有以獲得B和等候A.

如果每個進程將得到的第一,死鎖的發生率降低。

由於您在整個頁面上發生死鎖,因此很難確保每個人都獲得相同的頁面來開始他們的交易。

您可以嘗試通過確保頁面之間的行被廣泛攪亂來減少衝突。

您可以嘗試通過引入一個「您必須首先獲取」行來減少衝突,這將有效地實現單線程應用程序。

+0

有沒有辦法確保行將被分發?我不知道數據庫如何確定哪一頁粘貼該行(我假設它是基於關鍵字)。將另一個字段添加到隨機數(或UUID)的密鑰是否有助於分配行? – Jesse 2010-01-29 20:19:33

+0

@Jesse:UUID可能是足夠隨機的。你有隨機數發生器是非常隨機的。你也可以通過一些與引起碰撞的屬性不同的屬性進行索引。郵政編碼,例如。 – 2010-01-29 20:29:05