Sql-Server
我可以有一個未被發現的死鎖嗎?
第一次在伺服器上執行
sp_whoisactive
時,我遇到了一些意想不到的事情:兩個會話已經執行了 13 天,但它們似乎都相互阻塞。看看
sys.dm_tran_locks
:阻塞程序門檻值設置的配置值為 10 秒。正在通過死鎖監視器在伺服器上成功解決其他死鎖。
參數資訊
@get_locks
:<Database name="DB1"> <Locks> <Lock request_mode="S" request_status="GRANT" request_count="1" /> </Locks> <Objects> <Object name="TBL1" schema_name="dbo"> <Locks> <Lock resource_type="OBJECT" request_mode="IX" request_status="GRANT" request_count="1" /> <Lock resource_type="PAGE" page_type="*" index_name="PK__TBL1__3214EC27326C5B6A" request_mode="U" request_status="GRANT" request_count="1" /> <Lock resource_type="PAGE" page_type="*" index_name="PK__TBL1__3214EC27326C5B6A" request_mode="U" request_status="WAIT" request_count="1" /> </Locks> </Object> </Objects> </Database> <Database name="DB1"> <Locks> <Lock request_mode="S" request_status="GRANT" request_count="1" /> </Locks> <Objects> <Object name="TBL2" schema_name="dbo"> <Locks> <Lock resource_type="OBJECT" request_mode="Sch-S" request_status="GRANT" request_count="2" /> </Locks> </Object> <Object name="TBL1" schema_name="dbo"> <Locks> <Lock resource_type="OBJECT" request_mode="IX" request_status="GRANT" request_count="5" /> <Lock resource_type="PAGE" page_type="*" index_name="PK__TBL1__3214EC27326C5B6A" request_mode="U" request_status="GRANT" request_count="33701" /> <Lock resource_type="PAGE" page_type="*" index_name="PK__TBL1__3214EC27326C5B6A" request_mode="U" request_status="WAIT" request_count="1" /> </Locks> </Object> </Objects> </Database>
我偶爾會看到“未檢測到的死鎖”一詞,但我對它們沒有任何直接經驗。我的問題是:
- 這可能是未檢測到的死鎖的範例嗎?如果沒有死鎖監視器執行緒的干預,我看不出這種情況是如何解決的,但由於某種原因,這種情況還沒有發生。
- 除了更新到最新的 CU 並希望問題不再發生之外,還有什麼可做的嗎?伺服器目前在 2017 CU10 上,我知道這有點過時了。
來自David Browne留下的評論- Microsoft
“未檢測到的死鎖”通常是指“無法檢測到的死鎖”,例如,會話被 SQL Server 鎖阻塞,而另一個會話在客戶端應用程序中被阻塞,或者會話呼叫
xp_cmdshell
其執行連接到數據庫的程序並被阻塞由會話等待完成xp_cmdshell
。沒有自動解決的普通死鎖看起來像一個錯誤。