如果需要「修改」一條資料,首先資料庫管理系統會在上面加鎖,以保證在同一時間只有乙個事務能進行修改操作。鎖定(locking)發生在當乙個事務獲得對某一資源的「鎖」時,這時,其他的事務就不能更改這個資源了,這種機制的存在是為了保證資料一致性。
每個使用
關係型資料庫的程式都可能遇到資料死鎖
[1]的情況。理解什麼是死鎖之前先要了解鎖定的概念:
多數情況下,可以認為如果乙個資源被鎖定,它總會在以後某個時間被釋放。而死鎖發生在當多個程序訪問同一資料庫時,其中每個程序擁有的鎖都是其他程序所需的,由此造成每個程序都無法繼續下去。簡單的說,程序a等待程序b釋放他的資源,b又等待a釋放他的資源,這樣就互相等待就形成死鎖。
雖然程序在執行過程中,可能發生死鎖,但死鎖的發生也必須具備一定的條件,死鎖的發生必須具備以下四個
必要條件。
1)互斥條件:指程序對所分配到的資源進行排它性使用,即在一段時間內某資源只由乙個程序占用。如果此時還有其它程序請求資源,則請求者只能等待,直至占有資源的程序用畢釋放。
2)請求和保持條件:指程序已經保持至少乙個資源,但又提出了新的資源請求,而該資源已被其它程序占有,此時請求程序阻塞,但又對自己已獲得的其它資源保持不放。
3)不剝奪條件:指程序已獲得的資源,在未使用完之前,不能被剝奪,只能在使用完時由自己釋放。
4)環路等待條件:指在發生死鎖時,必然存在乙個程序——資源的環形鏈,即程序集合中的p0正在等待乙個p1占用的資源;p1正在等待p2占用的資源,……,pn正在等待已被p0占用的資源。
一般情況只發生鎖超時,就是乙個程序需要訪問資料庫表或者欄位的時候,另外乙個程式正在執行帶鎖的訪問(比如修改資料),那麼這個程序就會等待,當等了很久鎖還沒有解除的話就會鎖超時,報告乙個系統錯誤,拒絕執行相應的sql操作。
發生死鎖的情況比較少,比如乙個程序需要訪問兩個資源(資料庫表或者字段),當獲取乙個資源的時候程序就對它執行鎖定,然後等待下乙個資源空閒,這時候如果另外乙個程序也需要兩個資源,而已經獲得並鎖定了第二個資源,那麼就會死鎖,因為當前程序鎖定第乙個資源等待第二個資源,而另外乙個程序鎖定了第二個資源等待第乙個資源,兩個程序都永遠得不到滿足。
資料庫死鎖的解決方案。
死鎖的預防和解除:
理解了死鎖的原因,尤其是產生死鎖的四個
必要條件,就可以最大可能地避免、預防和解除死鎖。所以,在
系統設計、
程序排程等方面注意如何不讓這四個
必要條件成立,如何確定資源的合理分配演算法,避免程序永久佔據系統資源。此外,也要防止程序在處於等待狀態的情況下占用資源,在系統執行過程中,對程序發出的每乙個系統能夠滿足的資源申請進行動態檢查,並根據檢查結果決定是否分配資源,若分配後系統可能發生死鎖,則不予分配,否則予以分配 。因此,對資源的分配要給予合理的規劃。
如何將死鎖減至最少
雖然不能完全避免死鎖,但可以使死鎖的數量減至最少。將死鎖減至最少可以增加
事務的吞吐量並減少系統開銷,因為只有很少的
事務回滾,而回滾會取消
事務執行的所有工作。由於死鎖時
回滾而由應用程式重新提交。
下列方法有助於最大限度地降低死鎖:
(1)按同一順序訪問物件。
(2)避免
事務中的使用者互動。
(3)保持
事務簡短並在乙個批處理中。
(4)使用低
隔離級別。
(5)使用繫結連線。
按同一順序訪問物件
如果所有併發
事務按同一順序訪問物件,則發生死鎖的可能性會降低。例如,如果兩個併發
事務獲得 supplier 表上的鎖,然後獲得 part 表上的鎖,則在其中乙個事務完成之前,另乙個事務被阻塞在 supplier 表上。第乙個事務提交或
回滾後,第二個事務繼續進行。不發生死鎖。將
儲存過程用於所有的
資料修改可以標準化訪問物件的順序。
避免事務中的使用者互動
避免編寫包含使用者互動的
事務,因為執行沒有使用者互動的批處理的速度要遠遠快於使用者手動響應查詢的速度,例如答覆應用程式請求引數的提示。例如,如果
事務正在等待使用者輸入,而使用者去吃午餐了或者甚至回家過週末了,則使用者將此事務掛起使之不能完成。這樣將降低系統的吞吐量,因為
事務持有的任何鎖只有在事務提交或
回滾時才會釋放。即使不出現死鎖的情況,訪問同一資源的其它
事務也會被阻塞,等待該事務完成。
保持事務簡短並在乙個批處理中
在同一資料庫中併發執行多個需要長時間執行的
事務時通常發生死鎖。
事務執行時間越長,其持有
排它鎖或
更新鎖的時間也就越長,從而堵塞了其它活動並可能導致死鎖。 保持
事務在乙個批處理中,可以最小化事務的網路通訊往返量,減少完成事務可能的延遲並釋放鎖。
使用低隔離級別 確定
事務是否能在更低的
隔離級別上執行。執行提交讀允許
事務讀取另乙個事務已讀取(未修改)的資料,而不必等待第乙個事務完成。使用較低的
隔離級別(例如提交讀)而不使用較高的隔離級別(例如可序列讀)可以縮短持有
共享鎖的時間,從而降低了鎖定爭奪。
使用繫結連線
使用繫結連線使同一應用程式所開啟的兩個或多個連線可以相互合作。次級連線所獲得的任何鎖可以象由主連線獲得的鎖那樣持有,反之亦然,因此不會相互阻塞。
資料庫死鎖
1.死鎖的概念 死鎖是程序死鎖的簡稱,是由dijkstra於1965年研究銀行家演算法時首先提出來的。它是計算機作業系統乃至併發程式設計中最難處理的問題之一。實際上,死鎖問題不僅在計算機系統中存在,在我們日常生活中它也廣泛存在。我們先看看這樣乙個生活中的例子 在一條河上有一座橋,橋面較窄,只能容納一...
資料庫死鎖
資料庫在進行insert,update,delete這些更新操作的時候為了保證資料一致性都會使用排他鎖。乙個事務裡進行update操作,在事務結束之前 commit or rollback 排他鎖不會被釋放。因此在乙個事務裡update多條資料的時候執行順序就尤為重要,兩個併發事務中更新操作的執行順...
資料庫死鎖
死鎖 所謂死鎖 是指兩個或兩個以上的程序在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去.此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序 由於資源占用是互斥的,當某個程序提出申請資源後,使得有關程序在無外力協助下,永遠分配不到必需的...