SQLSERVER 數據庫死鎖的分析,排查


說明:以下命令基於SQLSERVER2012 R2版本進行開發測試。

 

 

1.模擬一個表被鎖定

 

--開始一個事務
begin tran

--更新一個表
update tb_User set password='' where userid=''

--延遲提交事務,沒有提交事務,當前表處於鎖定狀態
waitfor delay '0:10:00'

commit tran

 

測試截圖如下:

 

 

 

2.怎么知道數據庫哪些對象被鎖定了?

--查詢被鎖定的系統資源名稱
select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName
from sys.dm_tran_locks where resource_type='OBJECT'

 

可以看到在會話ID為56的進程中,TB_User表被鎖定了,測試截圖如下:

 

 

 

3.怎么查看該表做了什么操作被鎖定,參與執行了什么Sql語句呢?根據上面的spid 我們根據以下腳本進行查詢

 

SELECT DEST.TEXT
FROM sys.[dm_exec_connections] SDEC
CROSS APPLY sys.[dm_exec_sql_text](SDEC.[most_recent_sql_handle]) AS DEST
WHERE SDEC.[most_recent_session_id] = 56

 

我們可以看到因為執行了步驟1被鎖定的,這樣就找到了死鎖的原因,測試截圖如下:

 

 

4.怎么解決死鎖的問題?

如果出現了死鎖,我們也找到了問題所在,肯定是看我們執行的腳本是否有問題,並且進行改進。但是如果我們想直接終止該進程,可以使用以下命令:

 

 

 

5.在使用步驟2中的命令,查看被鎖定的資源,發現剛才鎖定的進程已經釋放了,測試截圖如下:

 

 

以上就是怎么排查SqlServer中出現死鎖,以及簡單的解決辦法。

以上僅代表個人觀點,有不對的地方,歡迎大家指正。 、

相互學習,一起進步。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM