麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 數(shù)據(jù)庫 > SQL Server > 正文

深入淺出解析mssql在高頻,高并發(fā)訪問時(shí)鍵查找死鎖問題

2024-08-31 01:02:36
字體:
供稿:網(wǎng)友

死鎖對于DBA或是數(shù)據(jù)庫開發(fā)人員而言并不陌生,它的引發(fā)多種多樣,一般而言,數(shù)據(jù)庫應(yīng)用的開發(fā)者在設(shè)計(jì)時(shí)都會有一定的考量進(jìn)而盡量避免死鎖的產(chǎn)生.但有時(shí)因?yàn)橐恍┨厥鈶?yīng)用場景如高頻查詢,高并發(fā)查詢下由于數(shù)據(jù)庫設(shè)計(jì)的潛在問題,一些不易捕捉的死鎖可能出現(xiàn)從而影響業(yè)務(wù).這里為大家介紹由于設(shè)計(jì)問題引起的鍵查找死鎖及相關(guān)的解決辦法.

這里我們在測試的同時(shí)開啟trace profiler跟蹤死鎖視圖(locks:deadlock graph).(當(dāng)然也可以開啟跟蹤標(biāo)記,或者應(yīng)用擴(kuò)展事件(xevents)等捕捉死鎖)

創(chuàng)建測試對象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

此時(shí)開啟會話2執(zhí)行一小段時(shí)間時(shí)我們就可以看到類似錯(cuò)誤信息:圖1-1

深入淺出解析mssql在高頻,高并發(fā)訪問時(shí)鍵查找死鎖問題

                                                     圖1-1

而在我們開啟的跟蹤中捕捉到了如下的死鎖圖.圖1-2

深入淺出解析mssql在高頻,高并發(fā)訪問時(shí)鍵查找死鎖問題

                                                                              圖1-2

死鎖分析:可以看出由于讀進(jìn)程(108)請求寫進(jìn)程(79)持有的X鎖被阻塞的同時(shí),寫進(jìn)程(79)又申請讀進(jìn)程(108)鎖持有的S鎖.讀執(zhí)行計(jì)劃圖1-3,寫執(zhí)行計(jì)劃圖1-4

(由于在默認(rèn)隔離級別下(讀提交)讀申請S鎖只是瞬間過程,讀完立即釋放,不會等待事務(wù)完成),所以在并發(fā),執(zhí)行頻率不高的情形下不易出現(xiàn).但我們模擬的高頻情況使得S鎖獲得頻率非常高,此時(shí)就出現(xiàn)了僅僅兩個(gè)會話,一個(gè)讀,一個(gè)寫就造成了死鎖現(xiàn)象.

深入淺出解析mssql在高頻,高并發(fā)訪問時(shí)鍵查找死鎖問題

                                                                            圖1-3

深入淺出解析mssql在高頻,高并發(fā)訪問時(shí)鍵查找死鎖問題

                                                                              圖1-4
死鎖原因:讀操作中的鍵查找造成的額外鎖(聚集索引)需求

解決方案:在了解了死鎖產(chǎn)生的原因后,解決起來就比較簡單了.

我們可以從以下幾個(gè)方面入手.

a 消除額外的鍵查找鎖需的鎖

b 讀操作時(shí)取消獲取鎖

a.1我們可以創(chuàng)建覆蓋索引使select語句中的查詢列包含在指定索引中

CREATE NONCLUSTERED INDEX [inx_nlskey_incont2] ON [dbo].[testklup]([nlskey] ASC) INCLUDE ( [cont2])

 a.2 根據(jù)查詢需求,分步執(zhí)行,通過聚集索引獲取查詢列,避免鍵查找.

declare @cont2 char(3000)declare @clskey intwhile 1=1begin select @clskey=clskey from testklup where nlskey=1select @cont2=cont2 from testklup where clskey=@clskeyend

b 通過改變隔離級別,使用樂觀并發(fā)模式,讀操作時(shí)源行無需鎖

declare @cont2 char(3000)while 1=1begin select @cont2=cont2 from testklup with(nolock) where nlskey=1end

結(jié)束語.我們在解決問題時(shí),最好弄清問題的本質(zhì)原因,通過問題點(diǎn)尋找出適合自己的環(huán)境的解決方案再實(shí)施.

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 成人一级毛片 | 亚洲日本欧美 | 日韩视频在线免费 | 久久精品视频在线免费观看 | 男人的天堂视频网站 | 精品一区二区在线观看视频 | 毛片在线免费视频 | av黄色在线免费观看 | 亚洲二区免费 | 免费在线中文字幕 | 免费a视频在线观看 | 久久久久久久.comav | 91精品国产乱码久久久久久久久 | 精品久久久久久久 | 九九视频精品在线观看 | 成人福利在线视频 | 中国美女一级黄色大片 | 在线免费91 | 嫩呦国产一区二区三区av | 国产在线欧美日韩 | 亚洲国产美女视频 | 美女久久久久久久久 | 久久777国产线看观看精品 | 日韩黄在线观看 | 成人免费毛片在线观看 | 久久艳片| 九九热在线观看视频 | 午夜在线视频观看 | 亚洲精品欧美二区三区中文字幕 | 久久国产精品久久久久久 | 99日韩精品视频 | 一级做a爱片性色毛片 | 欧美日韩国产成人在线观看 | 午夜视频在线观看免费视频 | 成年免费大片黄在线观看岛国 | 免费看真人a一级毛片 | 99热久草 | 欧美日性 | 成人一级片毛片 | 成人9禁啪啪无遮挡免费 | 亚洲成人福利在线观看 |