時(shí)間:2015-06-28 00:00:00 來(lái)源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評(píng)論(0)
本文將為大家講的是SQL Server Profiler分析死鎖幾大步驟,這里也是為了大家更好的做好數(shù)據(jù)庫(kù)的管理工作。
在兩個(gè)或多個(gè)SQL Server進(jìn)程中,每一個(gè)進(jìn)程鎖定了其他進(jìn)程試圖鎖定的資源,就會(huì)出現(xiàn)死鎖,例如,進(jìn)程process1對(duì)table1持有1個(gè)排它鎖(X),同時(shí)process1對(duì)table2請(qǐng)求1個(gè)排它鎖(X), 進(jìn)程process2對(duì)table2持有1個(gè)排它鎖(X),同時(shí)process2對(duì)table1請(qǐng)求1個(gè)排它鎖(X) 類(lèi)似這種情況,就會(huì)出現(xiàn)死鎖,除非當(dāng)某個(gè)外部進(jìn)程斷開(kāi)死鎖,否則死鎖中的兩個(gè)事務(wù)都將無(wú)限期等待下去。
Microsoft SQL Server 數(shù)據(jù)庫(kù)引擎死鎖監(jiān)視器定期檢查陷入死鎖的任務(wù)。
如果監(jiān)視器檢測(cè)到循環(huán)依賴關(guān)系,將選擇其中一個(gè)任務(wù)作為犧牲品(通常是選擇占資源比較小的進(jìn)程作為犧牲品),然后終止其事務(wù)并提示錯(cuò)誤1205。
這里我們通過(guò)SQL Server Profiler來(lái)監(jiān)視分析死鎖的發(fā)生過(guò)程,那樣我們就會(huì)深刻理解死鎖的成因。
1.創(chuàng)建測(cè)試表。
在 Microsoft SQL Server Management Studio上,新建一個(gè)查詢,寫(xiě)創(chuàng)建表DealLockTest_1 & DealLockTest_2兩個(gè)表:
腳本:
- useTest
- --創(chuàng)建分析死鎖使用到的兩個(gè)表DealLockTest_1&DealLockTest_2
- go
- SetNocountOn
- Go
- ifobject_id('DealLockTest_1')IsNotNull
- DropTableDealLockTest_1
- go
- CreateTableDealLockTest_1
- (
- IDintIdentity(1,1)PrimaryKey,
- Namenvarchar(512)
- )
- ifobject_id('DealLockTest_2')IsNotNull
- DropTableDealLockTest_2
- go
- CreateTableDealLockTest_2
- (
- IDintIdentity(1,1)PrimaryKey,
- Namenvarchar(512)
- )
- Go
- InsertIntoDealLockTest_1(Name)
- SelectnameFromsys.all_objects
- InsertIntoDealLockTest_2(Name)
- SelectnameFromsys.all_objects
- Go
創(chuàng)建好表和插入測(cè)試數(shù)據(jù)后,先執(zhí)行腳本代碼(因?yàn)槲覀儾恍枰櫾摯a),緊接著,我們就模擬兩個(gè)會(huì)話,一個(gè)會(huì)話里面包含一個(gè)事務(wù)。這里我們就新建兩個(gè)查詢,其中第一個(gè)會(huì)話,是更新DealLockTest_1表后,等待5秒鐘,更新DealLocktest_2.
- UseTest
- Go
- --第一個(gè)會(huì)話
- BeginTran
- UpdateDealLockTest_1
- SetName=N'test1'
- WhereID>0
- /*這里的Waitfor等待,是為了容易獲取死鎖的發(fā)生*/
- WaitforDelay'00:00:05'
- UpdateDealLockTest_2
- SetName=N'test2'
- WhereID>0
- CommitTran
- Go
?
代碼寫(xiě)好后,我們先不要執(zhí)行代碼,接下來(lái)就寫(xiě)第二個(gè)會(huì)話代碼; 第二個(gè)會(huì)話更新表的順序,剛好與第一個(gè)會(huì)話相反,是更新DealLockTest_2表后,等待5秒鐘,更新DealLocktest_1.
- UseTest
- Go
- --第二個(gè)會(huì)話
- BeginTran
- UpdateDealLockTest_2
- SetName=N'test1'
- WhereID>0
- /*這里的Waitfor等待,是為了容易獲取死鎖的發(fā)生*/
- WaitforDelay'00:00:05'
- UpdateDealLockTest_1
- SetName=N'test2'
- WhereID>0
- CommitTran
- Go
?
第二個(gè)會(huì)話代碼,也先不要執(zhí)行。
2.啟動(dòng)SQL Server Profiler,創(chuàng)建Trace(跟蹤).
啟動(dòng)SQL Server Profiler工具(在Microsoft SQL Server Management Studio的工具菜單上就發(fā)現(xiàn)它),創(chuàng)建一個(gè)Trace,Trace屬性選擇主要是包含:
Deadlock graph Lock: Deadlock Lock: Deadlock Chain RPC:Completed SP:StmtCompleted SQL:BatchCompleted SQL:BatchStarting
點(diǎn)執(zhí)行按鈕,啟動(dòng)Trace。
3.執(zhí)行測(cè)試代碼&監(jiān)視死鎖。
轉(zhuǎn)到 Microsoft SQL Server Management Studio界面,執(zhí)行第一個(gè)會(huì)話&第二個(gè)會(huì)話的代碼,稍稍等待5秒鐘,我們就會(huì)發(fā)現(xiàn)其中一個(gè)會(huì)話收到報(bào)錯(cuò)消息
我們?cè)偾袚Q到SQL Server Profiler界面,就能發(fā)現(xiàn)SQL Server Profiler收到執(zhí)行腳本過(guò)程發(fā)生死鎖的信息。
OK,這里就先停止SQL Server Profiler上的"暫停跟蹤" Or "停止跟蹤"按鈕,下面我們具體分析死鎖發(fā)生過(guò)程。
4.分析死鎖
如下圖,我們可以看到第一個(gè)會(huì)話在SPID 54,第二個(gè)會(huì)話在SPID 55,一旦SQL Server發(fā)現(xiàn)死鎖,它就會(huì)確定一個(gè)優(yōu)勝者,可成功執(zhí)行,和另一個(gè)作為犧牲品,要回滾。
可以到看到EventClass列中,兩條SQL:BatchCompleted事件緊跟在Lock:DealLock后面,其中一條,它就是作為犧牲品,它會(huì)被回滾.而另一條SQL:BatchCompleted將會(huì)是優(yōu)勝者,成功執(zhí)行。
那么,誰(shuí)是優(yōu)勝者,誰(shuí)是犧牲品呢? 不用著急,通過(guò)DealLock graph事件,所返回來(lái)的信息,我們可以知道結(jié)果。
我們雖然不能明白DealLock graph圖示的含義,但通過(guò)圖中描述的關(guān)系,我們知道一些有用的信息。圖中左右兩旁橢圓形相當(dāng)一個(gè)處理節(jié)點(diǎn)(Process Node),當(dāng)鼠標(biāo)移動(dòng)到上面的時(shí)候,可以看到內(nèi)部執(zhí)行的代碼,如Insert,UPdate,Delete.有打叉的左邊橢圓形就是犧牲者,沒(méi)有打叉的右邊橢圓形是優(yōu)勝者。中間兩個(gè)長(zhǎng)方形就是一個(gè)資源節(jié)點(diǎn)(Resource Node),描述數(shù)據(jù)庫(kù)中的對(duì)象,如一個(gè)表、一行或一個(gè)索引。在我們當(dāng)前的實(shí)例中,資源節(jié)點(diǎn)描述的是,在聚集索引請(qǐng)求獲得排它鎖(X)。橢圓形與長(zhǎng)方形之間,帶箭頭的連線表示,處理節(jié)點(diǎn)與資源節(jié)點(diǎn)的關(guān)系,包含描述鎖的模式.
接下來(lái)我們更詳細(xì)的看圖里面的數(shù)據(jù)說(shuō)明。
先看右邊作為優(yōu)勝者的這橢圓形,我們可以看到內(nèi)容包含有:
服務(wù)器進(jìn)程 ID: 服務(wù)器進(jìn)程標(biāo)識(shí)符 (SPID),即服務(wù)器給擁有鎖的進(jìn)程分配的標(biāo)識(shí)符。服務(wù)器批 ID: 服務(wù)器批標(biāo)識(shí)符 (SBID)。執(zhí)行上下文 ID: 執(zhí)行上下文標(biāo)識(shí)符 (ECID)。與指定 SPID 相關(guān)聯(lián)的給定線程的執(zhí)行上下文 ID。ECID = {0,1,2,3, ...n},其中 0 始終表示主線程或父線程
關(guān)鍵詞標(biāo)簽:SQL Server Profiler
相關(guān)閱讀
熱門(mén)文章 淺談JSP JDBC來(lái)連接SQL Server 2005的方法 SqlServer2005對(duì)現(xiàn)有數(shù)據(jù)進(jìn)行分區(qū)具體步驟 sql server系統(tǒng)表?yè)p壞的解決方法 MS-SQL2005服務(wù)器登錄名、角色、數(shù)據(jù)庫(kù)用戶、角色、架構(gòu)的關(guān)系
人氣排行 配置和注冊(cè)O(shè)DBC數(shù)據(jù)源-odbc數(shù)據(jù)源配置教程 如何遠(yuǎn)程備份(還原)SQL2000數(shù)據(jù)庫(kù) SQL2000數(shù)據(jù)庫(kù)遠(yuǎn)程導(dǎo)入(導(dǎo)出)數(shù)據(jù) SQL2000和SQL2005數(shù)據(jù)庫(kù)服務(wù)端口查看或修改 修改Sql Server唯一約束教程 SQL Server 2005降級(jí)到2000的正確操作步驟 sql server系統(tǒng)表?yè)p壞的解決方法 淺談JSP JDBC來(lái)連接SQL Server 2005的方法