產生死鎖的條件:
這四個條件都是產生死鎖的必要條件。只要上述條件之一不滿足,就不會發生死鎖
例子
1. 事務之間對資源訪問順序的交替
事務a鎖住了記錄1並等待記錄2,事務b鎖住了記錄2並等待記錄1,這樣兩個事務就發生了死鎖。解決:盡量按照相同順序來鎖定資源
2. 併發修改同一記錄
事務a想執行update語句:update accounts set balance=900 where id=1,事務a需要先讀取表中id為1的記錄再執行更新操作,鎖從共享鎖上公升為排他鎖;如果在事務a獲得共享鎖時,有另乙個事務也獲得了id為1的記錄的共享鎖,也要把共享鎖上公升為排他鎖,就造成了死鎖。
解決:悲觀鎖或樂觀鎖;sqlserver支援更新鎖
更新鎖3. 索引不當導致全表掃瞄u鎖,發生在更新語句中,更新鎖用來查詢資料,當查詢的資料不是更新的資料時轉化為s鎖,當是要更新的資料時轉化為x鎖。
對於相同一條資料,只有乙個事務可以獲得更新鎖,其他事務需要等待,也就是其他事務不可以執行update語句,避免了死鎖情況。
如果在事務中執行了一條不滿足條件的語句,執行全表掃瞄,把行級鎖上公升為表級鎖,多個這樣的事務執行後,就很容易產生死鎖和阻塞
減少死鎖的方法
保持事務在乙個批處理中,可以最小化事務的網路通訊往返量,減少完成事務可能的延遲並釋放鎖。
死鎖檢測 參考
資料庫常見死鎖原因及處理
資料庫死鎖及解決死鎖問題
再談mysql鎖機制及原理—鎖的詮釋
資料庫死鎖
1.死鎖的概念 死鎖是程序死鎖的簡稱,是由dijkstra於1965年研究銀行家演算法時首先提出來的。它是計算機作業系統乃至併發程式設計中最難處理的問題之一。實際上,死鎖問題不僅在計算機系統中存在,在我們日常生活中它也廣泛存在。我們先看看這樣乙個生活中的例子 在一條河上有一座橋,橋面較窄,只能容納一...
資料庫死鎖
資料庫在進行insert,update,delete這些更新操作的時候為了保證資料一致性都會使用排他鎖。乙個事務裡進行update操作,在事務結束之前 commit or rollback 排他鎖不會被釋放。因此在乙個事務裡update多條資料的時候執行順序就尤為重要,兩個併發事務中更新操作的執行順...
資料庫死鎖
死鎖 所謂死鎖 是指兩個或兩個以上的程序在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去.此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序 由於資源占用是互斥的,當某個程序提出申請資源後,使得有關程序在無外力協助下,永遠分配不到必需的...