如何防止插入刪除表造成的資料庫死結

來源:互聯網
上載者:User

在資料庫中經常會遇到這樣的情況:一個主表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進行操作。因為刪除規則設定為層疊以後,刪除主表中的資料,子表中所有外部索引鍵關聯的資料也同時刪除了。

以上三個解決辦法都是同事給出的建議,我也不知道到底該使用什麼辦法才好。

不知道對於這種情況要防止死結大家還有沒有什麼其他好辦法?



相關文章

Cloud Intelligence Leading the Digital Future

Alibaba Cloud ACtivate Online Conference, Nov. 20th & 21st, 2019 (UTC+08)

Register Now >

Starter Package

SSD Cloud server and data transfer for only $2.50 a month

Get Started >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。