在兩個或多個任務中,如果每個任務鎖定了其他的任務試圖鎖定的資源,會造成這些任務永久阻塞,從而出現死鎖。此時系統處於死鎖狀態。
死鎖的原因:
在多使用者環境下,死鎖的發生是由於兩個事物都鎖定了不同的資源而又都在申請對方鎖定的資源,即一組程序中的各個程序均占有不會釋放的資源,但因相互申請其他程序占用的不會釋放的資源而處於一種永久等待的狀態。形成死鎖有4個必要條件:
請求與保持條件:獲取資源的程序可以同時申請新的資源。
非剝奪條件:已經分配的資源不能從該程序中剝奪。
迴圈等待條件:多個程序構成環路,並且其中每個程序都在等待相鄰程序正在占用的資源。
互斥條件:資源只能被乙個程序使用。
可能會造成死鎖的資源:
每個使用者會話可能有乙個或多個代表它執行的任務,其中每個任務可能獲取或等待獲取各種資源。以下型別的資源可能造成阻塞,並最終形成死鎖。
1.鎖:等待獲取資源的鎖可能導致死鎖。
2.工作執行緒:排隊等待可用工作執行緒的任務可能造成死鎖。
3.記憶體:當併發請求獲取記憶體,而當前的可用記憶體無法滿足其需求時,可能發生死鎖。
4.並行查詢執行的相關資源:通常與交換埠關聯的處理協調器、發生器或者使用者執行緒至少包含乙個不屬於 並行查詢的程序時,可能會相互阻塞,從而導致死鎖。
減少死鎖的策略:
1.在所有的事務中以相同的次序使用資源。
2.使事務盡可能簡短並且在乙個批次中。
3.為死鎖超時引數設定乙個合理範圍,如3~10分鐘;超時,則自動放棄本次操作,避免程序掛起。避免在事務內和使用者進行互動,減少資源的鎖定時間。
4.使用較低的隔離級別,相比較高的隔離級別能夠有效的減少持有共享鎖的時間,減少鎖之間的競爭。
5.使用bound connections。bound connections
允許兩個或多個事務連線共享事務和鎖,而且任意乙個事務連線都要申請鎖如同另乙個事務要申請鎖一樣,因此可以執行這些事務共享資料而不會有加鎖衝突。
6.使用基於版本控制的隔離級別。持快照事務隔離和指定read_committed隔離級別的事務使用行版本控制,可以將讀寫操作之間發生死鎖的機率降至最低。
SQLServer中的死鎖的介紹
原文 sqlserver中的死鎖的介紹 簡介 什麼是死鎖?我認為,死鎖是由於兩個物件在擁有乙份資源的情況下申請另乙份資源,而另乙份資源恰好又是這兩物件正持有的,導致兩物件無法完成操作,且所持資源無法釋放。什麼又是阻塞?阻塞是由於資源不足引起的排隊等待現象。比如同時兩個程序去更新乙個表。這裡我們可以把...
sqlserver中select造成死鎖
專案上線,準備驗收前出現了乙個嚴重的問題 很多select語句作為死鎖的犧牲,大部分報表無法開啟。這個問題影響範圍很大所有的報表都無法訪問,而我們的報表是放在電視上面輪播的,電視放在工廠裡面,所以出現問題後,整個工廠都知道了。解決這個問題比較曲折,首先是寫sap介面的同事發現了問題 sap一直在傳錯...
sqlserver中select造成死鎖
死鎖過程 於是只要讓查詢語句加共享鎖就解決問題了,sql server行版本級別控制能解決我的問題。使用基於行版本控制的隔離級別 當在基於行版本控制的隔離下執行的事務讀取資料時,讀取操作不會獲取正被讀取的資料上的共享鎖 s 鎖 找到最快設定行版本級別的方法 if charindex microsof...