《Mysql實(shí)例mysql 數(shù)據(jù)庫(kù)死鎖原因及解決辦法》要點(diǎn):
本文介紹了Mysql實(shí)例mysql 數(shù)據(jù)庫(kù)死鎖原因及解決辦法,希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
MYSQL學(xué)習(xí)死鎖(Deadlock)
MYSQL學(xué)習(xí)所謂死鎖:是指兩個(gè)或兩個(gè)以上的進(jìn)程在執(zhí)行過(guò)程中,因爭(zhēng)奪資源而造成的一種互相等待的現(xiàn)象,若無(wú)外力作用,它們都將無(wú)法推進(jìn)下去.此時(shí)稱(chēng)系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產(chǎn)生了死鎖,這些永遠(yuǎn)在互相等待的進(jìn)程稱(chēng)為死鎖進(jìn)程.由于資源占用是互斥的,當(dāng)某個(gè)進(jìn)程提出申請(qǐng)資源后,使得有關(guān)進(jìn)程在無(wú)外力協(xié)助下,永遠(yuǎn)分配不到必需的資源而無(wú)法繼續(xù)運(yùn)行,這就產(chǎn)生了一種特殊現(xiàn)象死鎖. 一種情形,此時(shí)執(zhí)行程序中兩個(gè)或多個(gè)線(xiàn)程發(fā)生永久堵塞(等待),每個(gè)線(xiàn)程都在等待被其他線(xiàn)程占用并堵塞了的資源.例如,如果線(xiàn)程A鎖住了記錄1并等待記錄2,而線(xiàn)程B鎖住了記錄2并等待記錄1,這樣兩個(gè)線(xiàn)程就發(fā)生了死鎖現(xiàn)象.計(jì)算機(jī)系統(tǒng)中,如果系統(tǒng)的資源分配策略不當(dāng),更常見(jiàn)的可能是程序員寫(xiě)的程序有錯(cuò)誤等,則會(huì)導(dǎo)致進(jìn)程因競(jìng)爭(zhēng)資源不當(dāng)而產(chǎn)生死鎖的現(xiàn)象.鎖有多種實(shí)現(xiàn)方式,比如意向鎖,共享-排他鎖,鎖表,樹(shù)形協(xié)議,時(shí)間戳協(xié)議等等.鎖還有多種粒度,比如可以在表上加鎖,也可以在記錄上加鎖.
MYSQL學(xué)習(xí)產(chǎn)生死鎖的原因主要是:
MYSQL學(xué)習(xí)(1)系統(tǒng)資源不足.
(2) 進(jìn)程運(yùn)行推進(jìn)的順序不合適.
(3)資源分配不當(dāng)?shù)?
MYSQL學(xué)習(xí)如果系統(tǒng)資源充足,進(jìn)程的資源請(qǐng)求都能夠得到滿(mǎn)足,死鎖出現(xiàn)的可能性就很低,否則就會(huì)因爭(zhēng)奪有限的資源而陷入死鎖.其次,進(jìn)程運(yùn)行推進(jìn)順序與速度不同,也可能產(chǎn)生死鎖.
MYSQL學(xué)習(xí)產(chǎn)生死鎖的四個(gè)必要條件:
MYSQL學(xué)習(xí)(1) 互斥條件:一個(gè)資源每次只能被一個(gè)進(jìn)程使用.
(2) 請(qǐng)求與保持條件:一個(gè)進(jìn)程因請(qǐng)求資源而阻塞時(shí),對(duì)已獲得的資源保持不放.
(3) 不剝奪條件:進(jìn)程已獲得的資源,在末使用完之前,不能強(qiáng)行剝奪.
(4) 循環(huán)等待條件:若干進(jìn)程之間形成一種頭尾相接的循環(huán)等待資源關(guān)系.
MYSQL學(xué)習(xí)這四個(gè)條件是死鎖的必要條件,只要系統(tǒng)發(fā)生死鎖,這些條件必然成立,而只要上述條件之一不滿(mǎn)足,就不會(huì)發(fā)生死鎖.
MYSQL學(xué)習(xí)死鎖的預(yù)防和解除:
MYSQL學(xué)習(xí)理解了死鎖的原因,尤其是產(chǎn)生死鎖的四個(gè)必要條件,就可以最大可能地避免、預(yù)防和解除死鎖.所以,在系統(tǒng)設(shè)計(jì)、進(jìn)程調(diào)度等方面注意如何不讓這四個(gè)必要條件成立,如何確定資源的合理分配算法,避免進(jìn)程永久占據(jù)系統(tǒng)資源.此外,也要防止進(jìn)程在處于等待狀態(tài)的情況下占用資源,在系統(tǒng)運(yùn)行過(guò)程中,對(duì)進(jìn)程發(fā)出的每一個(gè)系統(tǒng)能夠滿(mǎn)足的資源申請(qǐng)進(jìn)行動(dòng)態(tài)檢查,并根據(jù)檢查結(jié)果決定是否分配資源,若分配后系統(tǒng)可能發(fā)生死鎖,則不予分配,否則予以分配 .因此,對(duì)資源的分配要給予合理的規(guī)劃.
如何將死鎖減至最少
MYSQL學(xué)習(xí)
雖然不能完全避免死鎖,但可以使死鎖的數(shù)量減至最少.將死鎖減至最少可以增加事務(wù)的吞吐量并減少系統(tǒng)開(kāi)銷(xiāo),因?yàn)橹挥泻苌俚氖聞?wù)回滾,而回滾會(huì)取消事務(wù)執(zhí)行的所有工作.由于死鎖時(shí)回滾而由應(yīng)用程序重新提交.
MYSQL學(xué)習(xí)下列方法有助于最大限度地降低死鎖:
MYSQL學(xué)習(xí)(1)按同一順序訪(fǎng)問(wèn)對(duì)象.
(2)避免事務(wù)中的用戶(hù)交互.
(3)保持事務(wù)簡(jiǎn)短并在一個(gè)批處理中.
(4)使用低隔離級(jí)別.
(5)使用綁定連接.
MYSQL學(xué)習(xí)按同一順序訪(fǎng)問(wèn)對(duì)象
MYSQL學(xué)習(xí)如果所有并發(fā)事務(wù)按同一順序訪(fǎng)問(wèn)對(duì)象,則發(fā)生死鎖的可能性會(huì)降低.例如,如果兩個(gè)并發(fā)事務(wù)獲得 Supplier 表上的鎖,然后獲得 Part 表上的鎖,則在其中一個(gè)事務(wù)完成之前,另一個(gè)事務(wù)被阻塞在 Supplier 表上.第一個(gè)事務(wù)提交或回滾后,第二個(gè)事務(wù)繼續(xù)進(jìn)行.不發(fā)生死鎖.將存儲(chǔ)過(guò)程用于所有的數(shù)據(jù)修改可以標(biāo)準(zhǔn)化訪(fǎng)問(wèn)對(duì)象的順序.
MYSQL學(xué)習(xí)避免事務(wù)中的用戶(hù)交互
MYSQL學(xué)習(xí)避免編寫(xiě)包含用戶(hù)交互的事務(wù),因?yàn)檫\(yùn)行沒(méi)有用戶(hù)交互的批處理的速度要遠(yuǎn)遠(yuǎn)快于用戶(hù)手動(dòng)響應(yīng)查詢(xún)的速度,例如答復(fù)應(yīng)用程序請(qǐng)求參數(shù)的提示.例如,如果事務(wù)正在等待用戶(hù)輸入,而用戶(hù)去吃午餐了或者甚至回家過(guò)周末了,則用戶(hù)將此事務(wù)掛起使之不能完成.這樣將降低系統(tǒng)的吞吐量,因?yàn)槭聞?wù)持有的任何鎖只有在事務(wù)提交或回滾時(shí)才會(huì)釋放.即使不出現(xiàn)死鎖的情況,訪(fǎng)問(wèn)同一資源的其它事務(wù)也會(huì)被阻塞,等待該事務(wù)完成.
MYSQL學(xué)習(xí)保持事務(wù)簡(jiǎn)短并在一個(gè)批處理中
MYSQL學(xué)習(xí)在同一數(shù)據(jù)庫(kù)中并發(fā)執(zhí)行多個(gè)需要長(zhǎng)時(shí)間運(yùn)行的事務(wù)時(shí)通常發(fā)生死鎖.事務(wù)運(yùn)行時(shí)間越長(zhǎng),其持有排它鎖或更新鎖的時(shí)間也就越長(zhǎng),從而堵塞了其它活動(dòng)并可能導(dǎo)致死鎖.
MYSQL學(xué)習(xí)保持事務(wù)在一個(gè)批處理中,可以最小化事務(wù)的網(wǎng)絡(luò)通信往返量,減少完成事務(wù)可能的延遲并釋放鎖.
MYSQL學(xué)習(xí)使用低隔離級(jí)別
MYSQL學(xué)習(xí)確定事務(wù)是否能在更低的隔離級(jí)別上運(yùn)行.執(zhí)行提交讀允許事務(wù)讀取另一個(gè)事務(wù)已讀取(未修改)的數(shù)據(jù),而不必等待第一個(gè)事務(wù)完成.使用較低的隔離級(jí)別(例如提交讀)而不使用較高的隔離級(jí)別(例如可串行讀)可以縮短持有共享鎖的時(shí)間,從而降低了鎖定爭(zhēng)奪.
MYSQL學(xué)習(xí)使用綁定連接
MYSQL學(xué)習(xí)使用綁定連接使同一應(yīng)用程序所打開(kāi)的兩個(gè)或多個(gè)連接可以相互合作.次級(jí)連接所獲得的任何鎖可以象由主連接獲得的鎖那樣持有,反之亦然,因此不會(huì)相互阻塞.
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/5946.html