前段時間我寫的文章 SQL Server 隱式轉換引發的躺槍死鎖 中有的朋友評論回復說在SQL2008R2測試時并未出現死鎖,自己一測果然如此,因此給大家帶來的疑惑表示抱歉,這里我就解釋下其原因.
回顧:SQL2012中發生死鎖的原因已經向大家解釋了,因為隱式轉換造成的表掃描擴大了鎖規模.但在SQL2008R2中就未有同樣的現象出現,很顯然鎖規模沒有擴大,原因在于SQL Server的優化器為我們做了額外的事情-動態檢索
動態檢索:基于索引查找的優勢,SQL Server(部分版本)會嘗試將一些情形進行內部轉換,使得索引檢索的覆蓋面更廣,對其實重要補充.
還是之前那篇的實例,我們在SQL2008R2中看到的update的執行計劃如圖1-1
Code 生成測試數據
create table testlock(ID varchar(10) PRimary key clustered,col1 varchar(20),col2 char(200))go----------create test tabledeclare @i intset @i = 1while @i < 100begininsert into testlockselect right(replicate('0',10)+ cast(@i as varchar(10)),10),'aaa','fixchar'set @i = @i+1endgo----------generate test dataView Code
Code 死鎖語句
declare @ID nvarchar(10)begin tran select top 1 @ID = ID from testlock with(updlock, rowlock, readpast)where col1 = 'aaa'order by id ascselect @IDwaitfor delay '00:00:20'update testlock set col1 = 'bbb' where id = @IDcommit tranView Code
新聞熱點
疑難解答