我可能会遇到未被发现的死锁吗?

Joe*_*ish 10 sql-server deadlock sql-server-2017

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>
Run Code Online (Sandbox Code Playgroud)

我偶尔会看到“未检测到的死锁”这个术语,但我对它们没有任何直接的经验。我的问题是:

  1. 这可能是未检测到的死锁的一个例子吗?如果没有死锁监视器线程的干预,我看不到这种情况如何得到解决,但由于某种原因,这种情况尚未发生。
  2. 除了更新到最新的 CU 并希望问题不再发生之外,还有什么办法吗?服务器当前版本为 2017 CU10,我知道它有点过时了。

小智 2

来自David Browne留下的评论- Microsoft

“未检测到的死锁”通常意味着“无法检测到的死锁”,例如,会话被 SQL Server 锁阻塞,而另一个在客户端应用程序中被阻塞,或者会话调用xp_cmdshell运行连接到数据库的程序并被阻塞。通过会话等待 的完成xp_cmdshell。没有自动解决的普通死锁看起来像是一个错误。