sql server 死鎖排查

来源:https://www.cnblogs.com/MrHSR/archive/2018/05/14/9034890.html
-Advertisement-
Play Games

記得以前客戶在使用軟體時,有偶發出現死鎖問題,因為發生的時間不確定,不好做問題的重現,當時解決問題有點棘手了。 現總結下查看死鎖的常用二種方式: 第一種是圖形化監聽: sqlserver -->工具--> sql server profiler 登錄後在跟蹤屬性中選擇如下圖: 監聽到的死鎖圖形如下圖 ...


 

記得以前客戶在使用軟體時,有偶發出現死鎖問題,因為發生的時間不確定,不好做問題的重現,當時解決問題有點棘手了。

現總結下查看死鎖的常用二種方式:

第一種是圖形化監聽:

  sqlserver -->工具--> sql server profiler   登錄後在跟蹤屬性中選擇如下圖:

   

   監聽到的死鎖圖形如下圖

    

   這裡的描述大致是:有二個進程 一個進程ID是96, 另一個ID是348.   系統自動kill 掉了進程ID:96,保留了進程ID:348 的事務Commit。

  上面死鎖是由於批量更新出現PAG範圍鎖, 雙方進程在同一分區索引資源上。ID96,348都請求想獲取更新鎖(U),各占排它鎖(x)不釋放,直到鎖超時。

第二種是使用日誌跟蹤(errorlog)

 以全局方式打開指定的跟蹤標記

    DBCC TRACEON(1222,-1)

    DBCC TRACEON(1204,-1) 

 使用  EXEC master..xp_readerrorlog 查看日誌。 由於記錄的死鎖信息太多,貼出幾個重點說下

Deadlock encountered .... Printing deadlock information
Wait-for graph
NULL
Node:1
PAGE: 7:1:6229275 CleanCnt:2 Mode:IX Flags: 0x3
Grant List 3:
Owner:0x00000004E99B7880 Mode: IX Flg:0x40 Ref:1 Life:02000000 SPID:219 ECID:0 XactLockInfo: 0x0000000575C7E970
SPID: 219 ECID: 0 Statement Type: UPDATE Line #: 84
Input Buf: Language Event: exec proc_PUB_StockDataImport
Requested by:
ResType:LockOwner Stype:'OR'Xdes:0x0000000C7A905D30 Mode: U SPID:64 BatchID:0 ECID:59 TaskProxy:(0x0000000E440AAFE0) Value:0x8d160240 Cost:(0/0)
NULL

Node:2
PAGE: 7:1:5692366 CleanCnt:2 Mode:U Flags: 0x3
Grant List 3:
Owner:0x0000000D12099B80 Mode: U Flg:0x40 Ref:0 Life:00000001 SPID:64 ECID:0 XactLockInfo: 0x000000136B4758F0
SPID: 64 ECID: 0 Statement Type: UPDATE Line #: 108
Input Buf: RPC Event: Proc [Database Id = 7 Object Id = 907150277]

-------- node:1 顯示的幾個關鍵信息:

 PAGE 7:1:6229275  (所在資料庫ID7, 1分區, 6229275行數)

 Mode: IX  鎖的模式  意向排它鎖

 SPID: 219  進程ID

 Event: exec proc_PUB_StockDataImport  執行的存儲過程名

-------node:2 顯示的幾個關鍵信息

RPC Event: Proc 遠程過程調用

 SPID: 64  進程ID

 

Victim Resource Owner:
ResType:LockOwner Stype:'OR'Xdes:0x0000000C7A905D30 Mode: U SPID:64 BatchID:0 ECID:59 TaskProxy:(0x0000000E440AAFE0) Value:0x8d160240 Cost:(0/0)
deadlock-list
deadlock victim=process956f4c8
process-list
process id=process956f4c8 taskpriority=0 logused=0 waitresource=PAGE: 7:1:6229275 waittime=2034 ownerId=2988267079 transactionname=UPDATE lasttranstarted=2018-04-19T13:54:00.360 XDES=0xc7a905d30 lockMode=U schedulerid=24 kpid=1308 status=suspended spid=64 sbid=0 ecid=59 priority=0 trancount=0 lastbatchstarted=2018-04-19T13:53:58.033 lastbatchcompleted=2018-04-19T13:53:58.033 clientapp=.Net SqlClient Data Provider hostname=VMSERVER76 hostpid=16328 isolationlevel=read committed (2) xactid=2988267079 currentdb=7 lockTimeout=4294967295 clientoption1=671088672 clientoption2=128056
executionStack
frame procname=Test.dbo.proc_CnofStock line=108 stmtstart=9068 stmtend=9336 sqlhandle=0x03000700c503123601ba25019ca800000100000000000000
update dbo.pub_stock
set UpdateTime=GETDATE()
from pub_stock a
join PUB_PlatfromStocktemp b on a.GUID=b.StockGuid

從上面的信息能看到kill 掉的是進程id是process956f4c8, 進程spid=64,lockMode=U 獲取更新鎖, executionStack 執行的堆信息

 

總結   避免死鎖的解決方法

         按同一順序訪問對象。

        優化索引,避免全表掃描,減少鎖的申請數目.

        避免事務中的用戶交互。

        使用基於行版本控制的隔離級別。

         將事務預設隔離級別的已提交讀改成快照

         SET TRANSACTION ISOLATION LEVEL SNAPSHOT

       使用nolock去掉共用鎖,但死鎖發生在u鎖或x鎖上,則nolock不起作用

       升級鎖顆粒度(頁鎖,表鎖), 以阻塞還代替死鎖

 

  

   

  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、解壓到想要安裝的位置,創建my.ini文件 my.ini的內容如下 2、用管理員許可權打開cmd命令行 3、切換到安裝目錄的bin文件夾目錄下,初始化data文件夾,因為解壓後的目錄里是沒有data文件夾的,不用手動創建 ——初始化的命令如下 ——安裝MySQL服務 ——啟動MySql服務 4、修 ...
  • 一、 視圖 二、 觸發器 三、 事務 四、 存儲過程 五、 函數 六、 流程式控制制 一 、視圖 視圖是一個虛擬表(非真實存在),其本質是【根據SQL語句獲取動態的數據集,併為其命名】,用戶使用時只需使用【名稱】即可獲取結果集,可以將該結果集當做表來使用。 使用視圖我們可以把查詢過程中的臨時表摘出來,用 ...
  • 在8之前的版本中,對於全局變數的修改,其只會影響其記憶體值,而不會持久化到配置文件中。資料庫重啟,又會恢覆成修改前的值。從8開始,可通過SET PERSIST命令將全局變數的修改持久化到配置文件中。 試舉一例 全局變數的修改會保存在兩處, 1. 數據目錄下mysqld-auto.cnf文件, 註意,不 ...
  • 查詢的基本語法 from關鍵字後面寫表名,表示數據來源於是這張表 select後面寫表中的列名,如果是*表示在結果中顯示表中所有列 在select後面的列名部分,可以使用as為列起別名,這個別名出現在結果集中 如果要查詢多個列,之間使用逗號分隔 消除重覆行 在select後面列前使用distinct ...
  • 1.大小寫轉換快捷鍵:Ctrl+Shift+U 轉為大寫 ,Ctrl+Shift+L 轉為小寫 ... ...
  • Oracle: create table zjhis.mz_zdxx_zl as select a.sfsb, wm_concat(a.zdmc) as 診斷 from zjhis.mz_zdxx a group by a.sfsb 直接可以使用 wm_concat 函數 SQl SERVER : ...
  • select * from(select row_number() over(partition by IDCARD order by DATATM desc) as rownum,* from (SELECT * FROM TABLENAME)as H1 ) as H where H.rownum ...
  • 一、在控制面板,卸載MySQL的所有組件 控制面板——》所有控制面板項——》程式和功能,卸載所有和MySQL有關的程式 二、找到你的MysQL安裝路徑,看還有沒有和MySQL有關的文件夾,全刪 如果安裝在C盤,檢查一下C:\Program Files (x86)和C:\Program Files 這 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...