多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全IT社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當前位置:首頁 > php框架 > 框架設計 > sql server中高并發(fā)情況下 同時執(zhí)行select和update語句死鎖問題 (二)

sql server中高并發(fā)情況下 同時執(zhí)行select和update語句死鎖問題 (二)

來源:程序員人生   發(fā)布時間:2015-01-13 09:06:23 閱讀次數(shù):5773次

        SQL Server死鎖使我們常常遇到的問題,數(shù)據(jù)庫操作的死鎖是不可避免的,本文其實不打算討論死鎖如何產(chǎn)生,重點在于解決死鎖。希望對您學習SQL Server死鎖方面能有所幫助。


        死鎖對DBA或是數(shù)據(jù)庫開發(fā)人員而言其實不陌生,它的引發(fā)多種多樣,1般而言,數(shù)據(jù)庫利用的開發(fā)者在設計時都會有1定的考量進而盡可能避免死鎖的產(chǎn)生.但有時由于1些特殊利用場景如高頻查詢,高并發(fā)查詢下由于數(shù)據(jù)庫設計的潛伏問題,1些不容易捕捉的死鎖可能出現(xiàn)從而影響業(yè)務.這里為大家介紹由于設計問題引發(fā)的鍵查找死鎖及相干的解決辦法.

       這里我們在測試的同時開啟trace profiler跟蹤死鎖視圖(locks:deadlock graph).(固然也能夠開啟跟蹤標記,或利用擴大事件(xevents)等捕捉死鎖)


創(chuàng)建測試對象code

<span style="font-size:18px;"><span style="font-size:18px;">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' </span></span>

開啟會話1 摹擬高頻update操作

----摹擬高頻update操作


<span style="font-size:18px;"><span style="font-size:18px;">declare @i int set @i=100 while 1=1 begin update testklup set cont1=@i where clskey=1 set @i=@i+1 end</span></span>

開啟會話2 摹擬高頻select操作

----摹擬高頻select操作

<span style="font-size:18px;"><span style="font-size:18px;">declare @cont2 char(3000) while 1=1 begin select @cont2=cont2 from testklup where nlskey=1 end</span></span>

此時開啟會話2履行1小段時間時我們就能夠看到類似毛病信息:圖1⑴


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




死鎖分析:可以看出由于讀進程(108)要求寫進程(79)持有的X鎖被阻塞的同時,寫進程(79)又申請讀進程(108)鎖持有的S鎖.讀履行計劃圖1⑶,寫履行計劃圖1⑷

(由于在默許隔離級別下(讀提交)讀申請S鎖只是瞬間進程,讀完立即釋放,不會等待事務完成),所以在并發(fā),履行頻率不高的情形下不容易出現(xiàn).但我們摹擬的高頻情況使得S鎖取得頻率非常高,此時就出現(xiàn)了僅僅兩個會話,1個讀,1個寫就造成了死鎖現(xiàn)象.




死鎖緣由:讀操作中的鍵查找釀成的額外鎖(聚集索引)需求

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

我們可以從以下幾個方面入手.

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

b 讀操作時取消獲得鎖

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


<span style="font-size:18px;"><span style="font-size:18px;">CREATE NONCLUSTERED INDEX [inx_nlskey_incont2] ON [dbo].[testklup] ([nlskey] ASC) INCLUDE ( [cont2])</span></span>

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


<span style="font-size:18px;"><span style="font-size:18px;">declare @cont2 char(3000) declare @clskey intwhile 1=1 begin select @clskey=clskey from testklup where nlskey=1 select @cont2=cont2 from testklup where clskey=@clskey end</span></span>

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


<span style="font-size:18px;"><span style="font-size:18px;"> declare @cont2 char(3000) while 1=1 begin select @cont2=cont2 from testklup with(nolock) where nlskey=1 end </span></span>


結束語.我們在解決問題時,最好弄清問題的本質(zhì)緣由,通過問題點尋覓出合適自己的環(huán)境的解決方案再實行.




生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 日本xxxwww免费视频 | 精品一区二区免费视频 | 免费观看黄色网址 | 国产毛片儿 | 成年人免费在线视频观看 | 欧美成人精品高清在线播放 | 激情五月开心婷婷 | 免费毛片二级c片观看动漫 免费毛片全部不收费的 | 爱爱免费视频网站 | 狂野欧美性猛交xxxx | 2022精品天堂在线视频 | 亚洲最新黄色网址 | 精品国产免费人成在线观看 | 国产欧美久久久精品 | 在线观看中文字幕第一页 | 欧美伊人网 | 成人欧美视频在线观看播放 | 国产粉嫩00福利福利福利 | 自拍视频一区 | 狠狠去 | 羞羞动漫免费看 | 黑人疯狂做人爱视频 | 成人18网址在线观看 | 亚洲第成色999久久网站 | 最近中文字幕高清字幕在线视频 | 国产成人精品午夜二三区 | 三浦惠理子中文字幕在线一区二区 | 国产色播 | 国产精品国产三级国产a | 国产一区不卡 | 美女啪视频 | 伊人色综合97 | 欧美日韩国产中文字幕 | 美国一级免费毛片 | 亚洲视频天堂 | 亚洲图片日韩 | 在线天堂在线 | 欧美日韩亚洲第一页 | 欧洲三级网站 | 欧美三级手机在线 | 五月天欧美激情午夜情 |