進程A等待進程B釋放他的資源葫松,B又等待A釋放他的資源瓦糕,這樣就互相等待形成死鎖
產(chǎn)生死鎖的必要條件
- 互斥:指進程對所分配的資源進行排它性使用,即在一段時間內(nèi)某資源只由一個進程占用腋么,如果此時還有其他進程請求資源咕娄,則請求者只能等待,直至占有資源的進程用畢釋放珊擂。
- 請求和保持:指進程已經(jīng)保持至少一個資源圣勒,但又提出了新的資源請求费变,而該資源已經(jīng)被其他進程占有,此時請求進程阻塞圣贸,但又對自己已獲得的其它資源保持不釋放挚歧。
- 不剝奪:指進程已獲得的資源,在未使用完之前吁峻,不能被剝奪滑负,只能在使用完時由自己釋放。
- 環(huán)路等待:指在發(fā)生死鎖時用含,必然存在一個進程——資源的環(huán)形鏈矮慕,即進程集合{P0,P1啄骇,P2痴鳄,···,Pn}中的P0正在等待一個P1占用的資源缸夹;P1正在等待P2占用的資源夏跷,……,Pn正在等待已被P0占用的資源明未。
死鎖的原因
一般情況只發(fā)生鎖超時槽华,就是一個進程需要訪問數(shù)據(jù)庫表或者字段的時候,另外一個程序正在執(zhí)行帶鎖的訪問(比如修改數(shù)據(jù))趟妥,那么這個進程就會等待猫态,當?shù)攘撕芫面i還沒有解除的話就會鎖超時,報告一個系統(tǒng)錯誤披摄,拒絕執(zhí)行相應的SQL操作亲雪。
發(fā)生死鎖的情況比較少吵护,比如一個進程需要訪問兩個資源(數(shù)據(jù)庫表或者字段)品擎,當獲取一個資源的時候進程就對它執(zhí)行鎖定,然后等待下一個資源空閑现拒,這時候如果另外一個進程也需要兩個資源寓盗,而已經(jīng)獲得并鎖定了第二個資源灌砖,那么就會死鎖,因為當前進程鎖定第一個資源等待第二個資源傀蚌,而另外一個進程鎖定了第二個資源等待第一個資源基显,兩個進程都永遠得不到滿足。
數(shù)據(jù)庫死鎖的解決方案善炫。
死鎖的預防和解除:
理解了死鎖的原因撩幽,尤其是產(chǎn)生死鎖的四個必要條件,就可以最大可能地避免箩艺、預防和解除死鎖窜醉。所以宪萄,在系統(tǒng)設計、進程調(diào)度等方面注意如何不讓這四個必要條件成立榨惰,如何確定資源的合理分配算法拜英,避免進程永久占據(jù)系統(tǒng)資源。此外读串,也要防止進程在處于等待狀態(tài)的情況下占用資源,在系統(tǒng)運行過程中聊记,對進程發(fā)出的每一個系統(tǒng)能夠滿足的資源申請進行動態(tài)檢查撒妈,并根據(jù)檢查結(jié)果決定是否分配資源恢暖,若分配后系統(tǒng)可能發(fā)生死鎖,則不予分配狰右,否則予以分配 杰捂。因此,對資源的分配要給予合理的規(guī)劃棋蚌。
如何將死鎖減至最少
雖然不能完全避免死鎖嫁佳,但可以使死鎖的數(shù)量減至最少。將死鎖減至最少可以增加事務的吞吐量并減少系統(tǒng)開銷谷暮,因為只有很少的事務回滾蒿往,而回滾會取消事務執(zhí)行的所有工作。由于死鎖時回滾而由應用程序重新提交湿弦。
下列方法有助于最大限度地降低死鎖:
(1)按同一順序訪問對象瓤漏。
(2)避免事務中的用戶交互。
(3)保持事務簡短并在一個批處理中颊埃。
(4)使用低隔離級別蔬充。
(5)使用綁定連接。
按同一順序訪問對象
如果所有并發(fā)事務按同一順序訪問對象班利,則發(fā)生死鎖的可能性會降低饥漫。例如,如果兩個并發(fā)事務獲得 Supplier 表上的鎖罗标,然后獲得 Part 表上的鎖庸队,則在其中一個事務完成之前,另一個事務被阻塞在 Supplier 表上闯割。第一個事務提交或回滾后皿哨,第二個事務繼續(xù)進行。不發(fā)生死鎖纽谒。將存儲過程用于所有的數(shù)據(jù)修改可以標準化訪問對象的順序证膨。
避免事務中的用戶交互
避免編寫包含用戶交互的事務,因為運行沒有用戶交互的批處理的速度要遠遠快于用戶手動響應查詢的速度鼓黔,例如答復應用程序請求參數(shù)的提示央勒。例如不见,如果事務正在等待用戶輸入,而用戶去吃午餐了或者甚至回家過周末了崔步,則用戶將此事務掛起使之不能完成稳吮。這樣將降低系統(tǒng)的吞吐量,因為事務持有的任何鎖只有在事務提交或回滾時才會釋放井濒。即使不出現(xiàn)死鎖的情況灶似,訪問同一資源的其它事務也會被阻塞,等待該事務完成瑞你。
保持事務簡短并在一個批處理中
在同一數(shù)據(jù)庫中并發(fā)執(zhí)行多個需要長時間運行的事務時通常發(fā)生死鎖酪惭。事務運行時間越長,其持有排它鎖或更新鎖的時間也就越長者甲,從而堵塞了其它活動并可能導致死鎖春感。
保持事務在一個批處理中,可以最小化事務的網(wǎng)絡通信往返量虏缸,減少完成事務可能的延遲并釋放鎖鲫懒。
使用低隔離級別
確定事務是否能在更低的隔離級別上運行。執(zhí)行提交讀允許事務讀取另一個事務已讀裙粽蕖(未修改)的數(shù)據(jù)窥岩,而不必等待第一個事務完成。使用較低的隔離級別(例如提交讀)而不使用較高的隔離級別(例如可串行讀)可以縮短持有共享鎖的時間宰缤,從而降低了鎖定爭奪颂翼。
使用綁定連接
使用綁定連接使同一應用程序所打開的兩個或多個連接可以相互合作。次級連接所獲得的任何鎖可以象由主連接獲得的鎖那樣持有撵溃,反之亦然疚鲤,因此不會相互阻塞。