同一删除查询上的页面锁定

Posted

技术标签:

【中文标题】同一删除查询上的页面锁定【英文标题】:Pagelock on same delete query 【发布时间】:2014-07-21 16:39:25 【问题描述】:

尝试执行delete 语句时有时会出现死锁。死锁图在受害者和“赢家”列表中显示相同的 delete 语句(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】:

如果您的删除查询应返回唯一的单个行,则添加一个索引以帮助查找这些行(在您的示例中为“ConId”和“Key”上的索引)。

就目前而言,查询是锁定页面,有时您会在同一页面中有两行,从而导致您遇到死锁

【讨论】:

以上是关于同一删除查询上的页面锁定的主要内容,如果未能解决你的问题,请参考以下文章

删除锚标签上的确认消息

使用文件输入后,Javascript 警报会锁定 IOS Chrome 上的页面

HTML表单与isset在同一页面上的结果[重复]

MS Access 直通选择查询导致 SQL Server 中的页面锁定

可以使用在同一页面上的表单中选择的值填充 php/mysql 调用吗?

删除 html 页面的可打印版本上的输入占位符