您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關SQLServer中怎么實現死鎖,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
SQLServer怎么死鎖
壓力測試的業務場景:
1.模擬用戶提交申請
a)涉及到的表
i.申請主表,一次申請生成一條數據。
ii.申請的醫生明細,一次申請包含多個醫生,一個申請包含100個醫生
iii.單個醫生明細,每個醫生一條明細數據
綜上所述一條申請的創建,需要插入201條數據。
b)申請邏輯
i.首先調用保存
ii.然后執行提交邏輯
各種邏輯驗證,這是歷史原因造成的(一個維護了幾年的項目代碼邏輯的混亂是難以想象的),總是在提交數據時做雙重較驗,比如數據是否有重復行的邏輯,這里會反復讀取申請醫生表以及醫生明細這兩個申請明細子表。這也是產生死鎖的主要原因,此場景已經滿足了同時讀取以及修改同一表的情況。除此還會往其它表中插入數據,比如一些狀態跟蹤信息,發郵件等。
SQLServer怎么死鎖
至于為什么被分割成兩個邏輯來處理這原本是同一動作的需求,已經法考正最初的設計者了,這些邏輯包含各種EntityFramwork的查詢寫法,很難做有效的優化。
2.壓力設置
a)并發8個用戶
b)每1分鐘增加5個用戶
降低事務隔離級別為readuncommitted,結果是并不能消除死鎖,但死鎖的次數有所降低,主要時共享鎖引發的死鎖次數降低了。
分段分析法,也可以說是排除法。只執行一部分邏輯,比如我們上面的一個申請分為兩步,先保存后提交,只保存的結果是死鎖依舊。
尋找死鎖跟蹤的方法,試圖尋找死鎖的本質原因。我簡單的按我自己的理解翻譯了一些MVP寫的文章,大家可以參考。
[翻譯]:SQL死鎖-鎖的類型
解釋了SQL中的各種鎖以及它們之間的兼容性,只有了解了這些才能知道鎖發生的場景,比如知道了共享鎖之間是兼容的就能馬上反應出純讀的操作是不會發生阻塞的
[翻譯]:SQL死鎖-鎖與事務級別
事務隔離級別的不同會影響鎖的行為,其中重要說明了降低事務隔離級別并不能消除死鎖
[翻譯]:SQL死鎖-阻塞
只有出現了阻塞才會升級成死鎖,所有了解阻塞是第一件事
[翻譯]:SQL死鎖-阻塞探測
這篇通過兩種方式說明如何去跟蹤分析死鎖的本質原因,通過SQL自帶的性能監控工且可以很方便的導出出現死鎖的相關信息
[翻譯]:SQL死鎖-為什么會出現死鎖
這篇非常詳細的說明了死鎖產生的原理
死鎖文章的重要結論:
大部分死鎖是因為未經過優化的查詢導致的,但因為我們項目在處理這個申請的邏輯中有太多邏輯,不太可能在短時間內進行有效的優化,所以我暫時采用了一個也許不是很好的方案,即想辦法降低排它鎖的相互競爭,說的簡單點說是在程序中通過一定的手段避免并發去調用更新或者插入數據的邏輯。
偏門解決方案:
通過一個取票排隊的隊列去解決數據插入以及更新的并發,原理就是一個線程想要插入數據時,先取票然后排隊,當號輪到它時才能執行數據庫操作,其它線程正在執行時,我們通過自族鎖來實現排隊。這個方法最大程序上解決死鎖的問題,但不推薦這么做,之所以采用這種非常規手段,也是受制于現有程序的邏輯。
關于SQLServer中怎么實現死鎖就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。