經(jīng)驗(yàn)分享 SQL Server死鎖產(chǎn)生的原因及解決辦法 |
發(fā)布時(shí)間: 2012/8/4 16:47:18 |
所有死鎖產(chǎn)生的最深層的原因是資源況爭,本文舉例說明這個(gè)問題。 現(xiàn)象一 一個(gè)用戶A訪問表A(鎖住了表A),然后又訪問表B,另一個(gè)用戶B 訪問表B(鎖住了表B),然后企圖訪問表A這時(shí)用戶A由于用戶B已經(jīng)鎖住表B,它必須等待用戶B釋放表B,才能繼續(xù),同樣用戶B要等用戶A釋放表A才能繼續(xù)這就死鎖了。 解決方法: 1、盡量避免同時(shí)鎖定兩個(gè)資源; 2、必須同時(shí)鎖定兩個(gè)資源時(shí),要保證在任何時(shí)刻都應(yīng)該按照相同的順序來鎖定資源。
用戶A讀一條紀(jì)錄,然后修改該條紀(jì)錄,這是用戶B修改該條紀(jì)錄,這里用戶A的事務(wù)里鎖的性質(zhì)由共享鎖企圖上升到獨(dú)占鎖(for update),而用戶B里的獨(dú)占鎖由于A有共享鎖存在所以必須等A釋,放掉共享鎖,而A由于B的獨(dú)占鎖而無法上升的獨(dú)占鎖也就不可能釋放共享鎖,于是出現(xiàn)了死鎖。這種死鎖比較隱蔽,但其實(shí)在稍大點(diǎn)的項(xiàng)目中經(jīng)常發(fā)生。 解決方法: 讓用戶A的事務(wù)(即先讀后寫類型的操作),在select 時(shí)就是用Update lock 語法如下: select * from table1 with(updlock) where (T006) 本文出自:億恩科技【mszdt.com】 服務(wù)器租用/服務(wù)器托管中國五強(qiáng)!虛擬主機(jī)域名注冊(cè)頂級(jí)提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM] |