激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Sql Server - 深入淺出解析mssql在高頻,高并發訪問時鍵查找死鎖問題

深入淺出解析mssql在高頻,高并發訪問時鍵查找死鎖問題

2020-04-06 12:46hebedich Sql Server

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

死鎖對于DBA或是數據庫開發人員而言并不陌生,它的引發多種多樣,一般而言,數據庫應用的開發者在設計時都會有一定的考量進而盡量避免死鎖的產生.但有時因為一些特殊應用場景如高頻查詢,高并發查詢下由于數據庫設計的潛在問題,一些不易捕捉的死鎖可能出現從而影響業務.這里為大家介紹由于設計問題引起的鍵查找死鎖及相關的解決辦法.

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

創建測試對象code

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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操作

?
1
2
3
4
5
6
7
8
declare @i int
set @i=100
while 1=1
 begin
 update testklup set cont1=@i
 where clskey=1
 set @i=@i+1
 end

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

----模擬高頻select操作

?
1
2
3
4
5
declare @cont2 char(3000)
while 1=1
begin
  select @cont2=cont2 from testklup where nlskey=1
end

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

深入淺出解析mssql在高頻,高并發訪問時鍵查找死鎖問題

                                                     圖1-1

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

深入淺出解析mssql在高頻,高并發訪問時鍵查找死鎖問題

                                                                              圖1-2

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

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

深入淺出解析mssql在高頻,高并發訪問時鍵查找死鎖問題

                                                                            圖1-3

深入淺出解析mssql在高頻,高并發訪問時鍵查找死鎖問題

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

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

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

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

b 讀操作時取消獲取鎖

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

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

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

?
1
2
3
4
5
6
7
8
declare @cont2 char(3000)
declare @clskey int
while 1=1
begin
  select @clskey=clskey from testklup where nlskey=1
 
  select @cont2=cont2 from testklup where clskey=@clskey
end

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

?
1
2
3
4
5
declare @cont2 char(3000)
while 1=1
begin
  select @cont2=cont2 from testklup with(nolock) where nlskey=1
end

結束語.我們在解決問題時,最好弄清問題的本質原因,通過問題點尋找出適合自己的環境的解決方案再實施.

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 免费黄色在线 | 福利免费在线 | 国产一级桃视频播放 | 欧美一区二区三区免费观看 | 免费小毛片 | 欧美福利视频一区二区三区 | 涩涩伊人| 一区二区三区日 | 精品中文字幕久久久久四十五十骆 | 久久av高清 | 日韩精品羞羞答答 | 97zyz成人免费视频 | 日美av在线 | 国产精品99久久99久久久二 | 日朝毛片 | 国产精品嘿咻嘿咻在线播放 | 羞羞视频免费视频欧美 | 99久在线视频 | 天天草天天干天天 | av在线免费观看中文字幕 | 黄色网址免费在线播放 | 色视频在线观看 | 黄色网络免费看 | 视频精品二区 | 欧美成年私人网站 | 91精品国产九九九久久久亚洲 | 欧美日韩1区2区 | 91九色视频| 狠狠操人人干 | 日本在线不卡一区二区三区 | 欧美14一15sex性hd | 国产亚洲精品久久久久久久久 | 国产精品亚洲一区二区三区在线观看 | 国产成人综合在线视频 | 欧美视频一二三区 | 少妇淫片免费一级毛片 | 亚洲第一页中文字幕 | 狠狠色成色综合网 | 精品成人久久久 | 久久精品a一级国产免视看成人 | 国产精品久久久久久久四虎电影 |