首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确定死锁的原因

确定死锁的原因
EN

Stack Overflow用户
提问于 2012-09-27 18:43:55
回答 1查看 1.1K关注 0票数 0

我有2+并发进程。在它们内部有一个执行重复验证(select) +保存(insert)操作的迭代。以下是关于死锁的sql-server-profiler信息:

代码语言:javascript
复制
<deadlock-list>
     <deadlock victim="process8e09048">
      <process-list>
       <process id="process8e09048" taskpriority="0" logused="1088" waitresource="PAGE: 29:1:376823" waittime="920" ownerId="1276429306" transactionname="user_transaction" lasttranstarted="2012-09-26T20:59:44.367" XDES="0x3077833c0" lockMode="S" schedulerid="1" kpid="4872" status="suspended" spid="79" sbid="0" ecid="0" priority="0" trancount="1" lastbatchstarted="2012-09-26T20:59:44.427" lastbatchcompleted="2012-09-26T20:59:44.427" clientapp=".Net SqlClient Data Provider" hostname="PORTAL" hostpid="5348" loginname="IIS APPPOOL\ASP.NET v4.0 Classic" isolationlevel="read committed (2)" xactid="1276429306" currentdb="29" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
        <executionStack>
         <frame procname="adhoc" line="1" stmtstart="282" sqlhandle="0x02000000b79df8046665e3984d6dc129fec20a3029fce9bc">
    SELECT id FROM [WP_CashCenter_StockTransactionLine] WHERE StockTransaction_id=@StockTransaction_id and Direction=@Direction and IsVerified=@IsVerified and QualificationType=@QualificationType and id &lt;&gt; @id and Product_id is null and Material_id=@Material_id and StockContainer_id is null and StockLocation_id=@StockLocation_id     </frame>
         <frame procname="unknown" line="1" sqlhandle="0x000000000000000000000000000000000000000000000000">
    unknown     </frame>
        </executionStack>
        <inputbuf>
    (@id bigint,@StockTransaction_id bigint,@Direction int,@IsVerified bit,@QualificationType int,@Material_id nvarchar(3),@StockLocation_id int)SELECT id FROM [WP_CashCenter_StockTransactionLine] WHERE StockTransaction_id=@StockTransaction_id and Direction=@Direction and IsVerified=@IsVerified and QualificationType=@QualificationType and id &lt;&gt; @id and Product_id is null and Material_id=@Material_id and StockContainer_id is null and StockLocation_id=@StockLocation_id    </inputbuf>
       </process>
       <process id="process5c13948" taskpriority="0" logused="2636" waitresource="PAGE: 29:1:376823" waittime="920" ownerId="1276429252" transactionname="user_transaction" lasttranstarted="2012-09-26T20:59:44.337" XDES="0x222e64e80" lockMode="S" schedulerid="6" kpid="2956" status="suspended" spid="70" sbid="0" ecid="0" priority="0" trancount="1" lastbatchstarted="2012-09-26T20:59:44.427" lastbatchcompleted="2012-09-26T20:59:44.427" clientapp=".Net SqlClient Data Provider" hostname="PORTAL" hostpid="5348" loginname="IIS APPPOOL\ASP.NET v4.0 Classic" isolationlevel="read committed (2)" xactid="1276429252" currentdb="29" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
        <executionStack>
         <frame procname="adhoc" line="1" stmtstart="238" sqlhandle="0x02000000d77dd1038a9b7f6d7158436117c042e42767242d">
    SELECT id FROM [WP_CashCenter_StockTransactionLine] WHERE StockTransaction_id=@StockTransaction_id and Direction=@Direction and IsVerified=@IsVerified and QualificationType=@QualificationType and id &lt;&gt; @id and Product_id is null and Material_id=@Material_id and StockContainer_id is null and StockLocation_id is null     </frame>
         <frame procname="unknown" line="1" sqlhandle="0x000000000000000000000000000000000000000000000000">
    unknown     </frame>
        </executionStack>
        <inputbuf>
    (@id bigint,@StockTransaction_id bigint,@Direction int,@IsVerified bit,@QualificationType int,@Material_id nvarchar(3))SELECT id FROM [WP_CashCenter_StockTransactionLine] WHERE StockTransaction_id=@StockTransaction_id and Direction=@Direction and IsVerified=@IsVerified and QualificationType=@QualificationType and id &lt;&gt; @id and Product_id is null and Material_id=@Material_id and StockContainer_id is null and StockLocation_id is null    </inputbuf>
       </process>
      </process-list>
      <resource-list>
       <pagelock fileid="1" pageid="376823" dbid="29" objectname="Edsson_WebPortal_v5.01.dbo.WP_CashCenter_StockTransactionLine" id="lock9302c80" mode="IX" associatedObjectId="72057594148028416">
        <owner-list>
         <owner id="process5c13948" mode="IX"/>
        </owner-list>
        <waiter-list>
         <waiter id="process8e09048" mode="S" requestType="convert"/>
        </waiter-list>
       </pagelock>
       <pagelock fileid="1" pageid="376823" dbid="29" objectname="Edsson_WebPortal_v5.01.dbo.WP_CashCenter_StockTransactionLine" id="lock9302c80" mode="IX" associatedObjectId="72057594148028416">
        <owner-list>
         <owner id="process8e09048" mode="IX"/>
        </owner-list>
        <waiter-list>
         <waiter id="process5c13948" mode="S" requestType="convert"/>
        </waiter-list>
       </pagelock>
      </resource-list>
     </deadlock>
    </deadlock-list>

语句是selects conditions。这些selects的where子句仅使用包含在非聚集索引中的列。执行计划:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-29 08:26:09

在这个死锁图中,两个进程都成功地执行了插入,并且在同一页上持有IX锁。它们必须在同一页中的两个单独行上也持有一个X锁。

由于SELECT被NC索引覆盖,因此死锁所涉及的页面必须属于NC索引。

您的SELECT语句正在尝试获取一个页级锁,该锁已经通过INSERT语句拥有一个IX锁。

因此,如果您的插入不属于同一StockTransaction_id,只需将行锁提示添加到SELECT就可以解决死锁情况。

RCSI保证读取器不会被写入器阻塞,反之亦然。但是,如果您的应用程序设计依赖于任何阻塞行为,这可能是一个问题。

您可以阅读更多关于由于不同的锁粒度here而导致的死锁的信息

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12619575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档