在尝试执行delete
语句时,有时会遇到死锁。死锁图表在受害者和"胜利者"中显示相同的delete
声明。 list(process list
显示具有2个不同进程ID的相同查询)。资源列表显示相同的objectname
但不同的pageid
。
有谁能解释这里出了什么问题以及为什么会出现这种僵局?两个进程如何在同一个对象上获取UIX
?它与表索引有关吗?如果是这样,我在表的复合主键上有一个聚簇索引,另外还有一个非聚簇索引...
<deadlock>
<victim-list>
<victimProcess id="process7b8d0784e8" />
</victim-list>
<process-list>
<process id="process7b8d0784e8" taskpriority="0" logused="1048" waitresource="PAGE: 103:10:395854 " waittime="1007" ownerId="11148456875" lockMode="U" status="suspended" isolationlevel="read committed (2)" currentdb="103">
<inputbuf>
(@0 nvarchar(128),@1 nvarchar(128))DELETE [dbo].[MyDummyTable]
WHERE (([ConId] = @0) AND ([Key] = @1))
</inputbuf>
</process>
<process id="process59bbdd2108" taskpriority="0" logused="2508" waitresource="PAGE: 103:11:334598 " waittime="921" ownerId="11148454338" lockMode="U" status="suspended" isolationlevel="read committed (2)" currentdb="103">
<inputbuf>
(@0 nvarchar(128),@1 nvarchar(128))DELETE [dbo].[MyDummyTable]
WHERE (([ConId] = @0) AND ([Key] = @1)) </inputbuf>
</process>
</process-list>
<resource-list>
<pagelock fileid="10" pageid="395854" dbid="103" subresource="FULL" objectname="7C91.dbo.MyDummyTable" id="lock3c5c753480" mode="UIX" associatedObjectId="498496">
<owner-list>
<owner id="process59bbdd2108" mode="UIX" />
</owner-list>
<waiter-list>
<waiter id="process7b8d0784e8" mode="U" requestType="wait" />
</waiter-list>
</pagelock>
<pagelock fileid="11" pageid="334598" dbid="103" subresource="FULL" objectname="7C91.dbo.MyDummyTable" id="lock46e37fdc80" mode="UIX" associatedObjectId="498496">
<owner-list>
<owner id="process7b8d0784e8" mode="UIX" />
</owner-list>
<waiter-list>
<waiter id="process59bbdd2108" mode="U" requestType="wait" />
</waiter-list>
</pagelock>
</resource-list>
</deadlock>
不好意思,如果这个问题太基本但我没有专业人士陷入僵局。
答案 0 :(得分:0)
如果您的删除查询应返回唯一的单独行,则添加索引以帮助查找这些行(在您的示例中为&#39; ConId&#39;&#39; Key&#39;索引)。
现在查询是锁定页面,有时你会在同一页面中有两行,导致你遇到的死锁