死鎖對于DBA或是數據庫開發人員而言并不陌生,它的引發多種多樣,一般而言,數據庫應用的開發者在設計時都會有一定的考量進而盡量避免死鎖的產生.但有時因為一些特殊應用場景如高頻查詢,高并發查詢下由于數據庫設計的潛在問題,一些不易捕捉的死鎖可能出現從而影響業務.這里為大家介紹由于設計問題引起的鍵查找死鎖及相關的解決辦法.
這里我們在測試的同時開啟trace PRofiler跟蹤死鎖視圖(locks:deadlock graph).(當然也可以開啟跟蹤標記,或者應用擴展事件(xevents)等捕捉死鎖)
創建測試對象code
create table testklup(clskey int not null,nlskey int not null,cont1 int not null,cont2 char(3000))create unique clustered index inx_cls on testklup(clskey)create unique nonclustered index inx_nlcs on testklup(nlskey) include(cont1)insert into testklup select 1,1,100,'aaa'insert into testklup select 2,2,200,'bbb'insert into testklup select 3,3,300,'ccc'
開啟會話1 模擬高頻update操作
----模擬高頻update操作 declare @i intset @i=100while 1=1 begin update testklup set cont1=@i where clskey=1 set @i=@i+1 end
開啟會話2 模擬高頻select操作
----模擬高頻select操作declare @cont2 char(3000)while 1=1begin select @cont2=cont2 from testklup where nlskey=1end
此時開啟會話2執行一小段時間時我們就可以看到類似錯誤信息:圖1-1
新聞熱點
疑難解答