在调试死锁时,我注意到在 xml 中resource-list
,第一个和第三个对象锁是相同的。这有什么原因吗?
<resource-list>
逐字逐句:
<resource-list>
<objectlock lockPartition="0" objid="580509447" subresource="FULL" dbid="7" objectname="censoredV2.dbo.pt_sales" id="lock1929b2d5500" mode="Sch-M" associatedObjectId="580509447">
<owner-list>
<owner id="process194df0e5468" mode="Sch-M" />
</owner-list>
<waiter-list>
<waiter id="process1947a066ca8" mode="Sch-M" requestType="wait" />
</waiter-list>
</objectlock>
<objectlock lockPartition="0" objid="94623380" subresource="FULL" dbid="7" objectname="censoredV2.dbo.pt" id="lock1929a8cf480" mode="IX" associatedObjectId="94623380">
<owner-list>
<owner id="process1907da684e8" mode="IX" />
</owner-list>
<waiter-list>
<waiter id="process194df0e5468" mode="Sch-M" requestType="wait" />
</waiter-list>
</objectlock>
<objectlock lockPartition="0" objid="580509447" subresource="FULL" dbid="7" objectname="censoredV2.dbo.pt_sales" id="lock1929b2d5500" mode="Sch-M" associatedObjectId="580509447">
<owner-list>
<owner id="process1947a066ca8" mode="Sch-M" requestType="wait" />
</owner-list>
<waiter-list>
<waiter id="process1907da684e8" mode="IX" requestType="wait" />
</waiter-list>
</objectlock>
</resource-list>
这是不一样的。如果您更仔细地查看它,“所有者 ID”是不同的。这是“模式修改”锁。SQL Server 只允许一个架构修改锁。
在第一个上,它由
process194df0e5468
它所有并被授予。在第三个中,它被请求process1947a066ca8
并等待,因为第一个已经拥有锁。这是Michael J.Swart 关于这把锁的好读物。