内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

SQLServer服務(wù)器端跟蹤并定位導致死鎖的SQL

《數(shù)據(jù)庫鎖機制》《模擬系統(tǒng)登錄時卡死以簡單了解數(shù)據(jù)庫原理》《Oracle數(shù)據(jù)表死鎖的解決方法》《深入淺出SQL Server中的死鎖》《怎么捕獲和記錄SQL Server中發(fā)生的死鎖》《SqlServer 并發(fā)事務(wù):死鎖跟蹤(一)簡單測試》《SqlServer 并發(fā)事務(wù):死鎖跟蹤(二)確定死鎖鎖定的資源》《SqlServer 并發(fā)事務(wù):死鎖跟蹤(三)6種跟蹤死鎖的方法總結(jié)》

西城網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,西城網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為西城數(shù)千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站制作要多少錢,請找那個售后服務(wù)好的西城做網(wǎng)站的公司定做!

說明

在多線程/多進程的程序中并發(fā)操作數(shù)據(jù)庫,如果對數(shù)據(jù)庫的運行原理理解的不深入,編寫的代碼沒有考慮數(shù)據(jù)庫運行原理的話,就很有可能導致死鎖的發(fā)生,那么就需要趕緊解決問題,而我最近也遇到了一個SQL Server死鎖的問題,所以趁此機會研究一下死鎖的排查方法

SQL Server死鎖時候報錯的信息一般是:事務(wù)(進程 ID 54)與另一個進程被死鎖在 鎖 資源上,并且已被選作死鎖犧牲品。請重新運行該事務(wù)。

那么應(yīng)該怎么排查?最好的方法當然是先定位到導致死鎖的兩條SQL,然后再去相關(guān)的程序源碼中找到相應(yīng)的SQL、檢查對應(yīng)的代碼邏輯,分析并發(fā)情況下死鎖的原因,然后破壞死鎖產(chǎn)生的條件來解決死鎖問題

上面的相關(guān)博客中有多種方法,這里先整理出一個簡單、有效的方法:利用服務(wù)器端跟蹤。其消耗小,在最繁忙的系統(tǒng)中也可使用。其他的方法會在日后慢慢研究和整理補充

模擬SQL Server死鎖

參考《數(shù)據(jù)庫鎖機制》,創(chuàng)建數(shù)據(jù)庫、創(chuàng)建表、模擬200萬條記錄

然后分別在SQL Server Management Studio打開兩個會話,分別執(zhí)行下面的兩條語句以模擬死鎖

--會話一 begin tran select * from testLock..test(holdlock); --holdlock意思是加共享鎖,直到事務(wù)結(jié)束才釋放 update testLock..test set name = \'joker\'; commit; --會話二 begin tran select * from testLock..test(holdlock); update testLock..test set name = \'xumeng\'; commit;

先整理一個簡單有效的方法

1.編寫如下腳本,并執(zhí)行

-- 定義參數(shù) declare @rc int declare @TraceID int declare @maxfilesize bigint set @maxfilesize = 5 -- 初始化跟蹤 exec @rc = sp_trace_create @TraceID output, 0, N\'E:DbLogdeadlockdetect\', @maxfilesize, NULL --此處的E:dblogdeadlockdetect是文件名(可自行修改),SQL會自動在后面加上.trc的擴展名 if (@rc != 0) goto error -- 設(shè)置跟蹤事件 declare @on bit set @on = 1 --下述語句中的148指的是locks:deadlock graph事件(參見sys.trace_events),12指的是spid列(參見sys.trace_columns) exec sp_trace_setevent @TraceID, 148, 12, @on exec sp_trace_setevent @TraceID, 148, 11, @on exec sp_trace_setevent @TraceID, 148, 4, @on exec sp_trace_setevent @TraceID, 148, 14, @on exec sp_trace_setevent @TraceID, 148, 26, @on exec sp_trace_setevent @TraceID, 148, 64, @on exec sp_trace_setevent @TraceID, 148, 1, @on -- 啟動跟蹤 exec sp_trace_setstatus @TraceID, 1 -- 記錄下跟蹤ID,以備后面使用 select TraceID = @TraceID goto finish error: select ErrorCode=@rc finish: go

運行上述語句后,每當SQL Server中發(fā)生死鎖事件,都會自動往文件E:DbLogdeadlockdetect.trc中插入一條記錄。

2.暫停和停止服務(wù)器端跟蹤

--先執(zhí)行這個SQL,否則如果直接執(zhí)行下面暫停的SQL會報錯: 無法停止或修改默認跟蹤。請使用SP_CONFIGURE 將其關(guān)閉 EXEC sp_configure \'show advanced options\', 1; GO RECONFIGURE; GO EXEC sp_configure \'default trace enabled\', 0; GO RECONFIGURE; GO --如果要暫停上面的服務(wù)器端跟蹤,可運行下面的語句: --注意:要想停止服務(wù)器跟蹤,必須先執(zhí)行這條暫停的SQL命令,不能直接執(zhí)行下面的停止的SQL命令 exec sp_trace_setstatus 1, 0; --第一個參數(shù)表示TraceID,即步驟1中的輸出參數(shù)。第二個參數(shù)表示將狀態(tài)改為0,即暫停 --先執(zhí)行暫停的SQL,才能接著執(zhí)行停止跟蹤的SQL,如果直接執(zhí)行停止的SQL會報錯的! --如果要停止上面的服務(wù)器端跟蹤,可運行下面的語句: exec sp_trace_setstatus 1, 2; --第一個參數(shù)表示TraceID,即步驟1中的輸出參數(shù)。第二個參數(shù)表示將狀態(tài)改為2,即停止

3.查看跟蹤文件內(nèi)容

對于上面生成的跟蹤文件(E:DbLogdeadlockdetect.trc),可通過兩種方法查看:

1).執(zhí)行t-sql命令

select * from fn_trace_gettable(\'E:DbLogdeadlockdetect.trc\',1)

結(jié)果中的TextData 列即以XML的形式返回死鎖的詳細信息。將TextData 的信息復制輸出到文本文件中,然后通過搜索SQL的關(guān)鍵詞,比如select、update、where、from、set等來找到信息中的SQL,就可以找到導致死鎖的兩條SQL語句。同時在該信息中還有死鎖相關(guān)的進程ID等信息!

2).在SQL Server Profiler中打開。

依次 進入Profiler(以管理員身份打開)-> 文件 -> 打開跟蹤文件 ->選擇E:DbLogdeadlockdetect.trc,就可以看到以圖形形式展現(xiàn)的死鎖信息了。

截圖如下,可以看到死鎖的的關(guān)鍵字:DeadLock graph,先選中死鎖的那條記錄,然后到下面的圖形界面將鼠標放在圖形上,就會展示對應(yīng)的SQL語句

標題名稱:SQLServer服務(wù)器端跟蹤并定位導致死鎖的SQL
當前URL:http://www.rwnh.cn/article14/cpeoge.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、手機網(wǎng)站建設(shè)、微信公眾號、服務(wù)器托管、搜索引擎優(yōu)化、用戶體驗

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

东莞市| 贵州省| 沂水县| 康保县| 普兰县| 许昌县| 辽阳县| 宁德市| 普洱| 乐昌市| 顺平县| 志丹县| 静乐县| 绥德县| 宾阳县| 宁明县| 麻栗坡县| 嵊泗县| 泾川县| 临湘市| 鲁甸县| 盐池县| 松桃| 文登市| 衢州市| 射洪县| 龙口市| 彩票| 黎川县| 佛学| 石门县| 张家口市| 永清县| 台东县| 肃宁县| 孝义市| 大悟县| 通榆县| 南江县| 宁德市| 元阳县|