說明:以下命令基於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中出現死鎖,以及簡單的解決辦法。
以上僅代表個人觀點,有不對的地方,歡迎大家指正。 、
相互學習,一起進步。
