同一个删除查询的Pagelock

时间:2014-07-21 16:39:26

标签: sql sql-server deadlock

在尝试执行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>

不好意思,如果这个问题太基本但我没有专业人士陷入僵局。

1 个答案:

答案 0 :(得分:0)

如果您的删除查询应返回唯一的单独行,则添加索引以帮助查找这些行(在您的示例中为&#39; ConId&#39;&#39; Key&#39;索引)。

现在查询是锁定页面,有时你会在同一页面中有两行,导致你遇到的死锁