在資料庫中常會遇到這樣的情況:一個主表A,一個子表B,B表包含有A表的主鍵作為外鍵。當要插入資料的時候,我們會先插入A表,然後再取得A表的Identity,再插入B表。如果要進行刪除操作,那麼就先刪除子表B,然後再刪除主表A。在程式設計中,對兩個表的操作是在一個事務中完成的。
當系統使用頻繁就會出現插入操作和刪除操作同時進行的情況。這時候插入交易會先將主表A放置獨佔鎖,然後去存取子表B,而同時刪除交易會對子表B放置獨佔鎖,然後去存取主表A。插入事務會一直獨佔A表,等待存取B表,刪除事務也一直獨佔著B表等待存取A表,於是兩個事務互相獨佔一個表,等待對方釋放資源,這樣就造成了死鎖。
遇到這種情況我聽說了三種做法:
1 取消AB兩個表之間的外鍵關係,這樣就可以在刪除資料的時候就可以先刪除主表A,然後刪除子表B,讓對這兩個表操作的事務存取順序一致。
2 在刪除A表數據之前,先使用一個事務將B表中相關外鍵指向另外A表中的另外一個數據(例如在A表中專門建立一行數據,主鍵設置為0,永遠不會對這行數據執行刪除操作),這樣就消除了要被刪除的資料在AB兩個表中的關係。然後就可以使用刪除事務,先刪除A表中的數據,再刪除B表中的數據,以達到和插入事務表存取一致,避免死鎖。
3 在外鍵關係中,將“刪除規則”設為“層疊”,這樣刪除交易只需要直接去刪除主表A,而不需要對子表B進行操作。因為刪除規則設定為層疊以後,刪除主表中的數據,子表中所有外鍵關聯的數據也同時刪除了。
以上三個解決方法都是同事給的建議,我也不知道到底該用什麼方法才好。
不知道對於這種情況要防止死鎖大家還有沒有什麼其他好方法?
http://www.cnblogs.com/studyzy/archive/2007/06/11/779811.html