SQL Server 死锁以及 XML 文件中资源列表部分中同一键锁的两个条目

问题描述 投票:0回答:1
sql sql-server database-deadlocks
1个回答
0
投票

为了我自己的理智,我做了以下查找和替换

  • process218b9814ca8 -> process1
  • process218bb8dcca8 -> process2
  • process218bb829468 -> process3

给下面的资源列表加上更简单的进程名称

<resource-list>
            <keylock hobtid="72057616768958464" dbid="16" objectname="Orders"
                indexname="PK_Orders" id="lock223c94b6980" mode="X"
                associatedObjectId="72057616768958464">
                <owner-list>
                    <owner id="process1" mode="X" />
                </owner-list>
                <waiter-list>
                    <waiter id="process2" mode="S" requestType="wait" />
                </waiter-list>
            </keylock>
            <keylock hobtid="72057616768958464" dbid="16" objectname="Orders"
                indexname="PK_Orders" id="lock223c94b6980" mode="X"
                associatedObjectId="72057616768958464">
                <owner-list>
                    <owner id="process2" mode="S" requestType="wait" />
                </owner-list>
                <waiter-list>
                    <waiter id="process3" mode="S" requestType="wait" />
                </waiter-list>
            </keylock>
            <keylock hobtid="72057616768958464" dbid="16" objectname="Orders"
                indexname="PK_Orders" id="lock2240f4bb680" mode="X"
                associatedObjectId="72057616768958464">
                <owner-list>
                    <owner id="process3" mode="X" />
                </owner-list>
                <waiter-list>
                    <waiter id="process1" mode="S" requestType="wait" />
                </waiter-list>
            </keylock>
</resource-list>

对于

lock223c94b6980
process1
X
锁,process2 正在等待
S
锁,process3 也在等待
S
锁,但显示为被 process2 阻止,而不是被根阻止者 process1 阻止,原因如下。

同时,

lock2240f4bb680
process3 持有
X
锁,而 process1 正在等待
S
锁。

循环等待实际上只涉及 process1process3,因为它们都拥有一个键上的

X
锁,并且正在等待另一个键上的
S
锁。

原因如下

S
发出的
process2
锁定请求与
S
发出的
process3
锁定请求兼容,但这只是维护锁定阻塞信息的方式。 如果某个服务员不是第一个处于 WAIT 状态的服务员,则始终认为它被第一个处于 WAIT 状态的服务员阻塞了

© www.soinside.com 2019 - 2024. All rights reserved.