【问题标题】:Deadlocking issue in parallel batch processing (Invoice Posting ax 2009)并行批处理中的死锁问题(Invoice Posting ax 2009)
【发布时间】:2016-05-07 16:28:34
【问题描述】:

我收到错误消息“无法在 SalesParmSubTable 中选择记录。 死锁,一个或多个用户同时锁定了整个表或其中的一部分”。

我使用 sql profiler 来获取死锁跟踪。有人可以帮忙改正吗。

<?xml version="1.0" encoding="UTF-8"?>
<deadlock-list>
   <deadlock victim="process58d048">
      <process-list>
         <process id="process58d048" taskpriority="0" logused="5784" waitresource="PAGE: 16:1:16714223" waittime="1587" ownerId="207752233" transactionname="user_transaction" lasttranstarted="2016-05-07T07:58:32.533" XDES="0x52376d950" lockMode="S" schedulerid="4" kpid="10860" status="suspended" spid="159" sbid="0" ecid="0" priority="0" trancount="1" lastbatchstarted="2016-05-07T07:58:32.553" lastbatchcompleted="2016-05-07T07:58:32.553" clientapp="Microsoft Dynamics AX" hostname="*********" hostpid="19816" loginname="************" isolationlevel="read committed (2)" xactid="207752233" currentdb="16" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
            <executionStack>
               <frame procname="adhoc" line="1" stmtstart="100" sqlhandle="0x02000000d3d2cf1665ba9e17ee49d6dd9bc2fbf295ad7168">SELECT A.DEL_SALESID,A.SALESNAME,A.PARMID,A.ORIGSALESID,A.TABLEREFID,A.DEL_ORIGTABLEREFID,A.JOURNALREFTABLEID,A.JOURNALREFRECID,A.SUBID,A.CREATEDDATETIME,A.CREATEDBY,A.RECVERSION,A.RECID FROM SALESPARMSUBTABLE A WHERE ((A.DATAAREAID=@P1) AND (A.PARMID=@P2)) AND NOT EXISTS (SELECT 'x' FROM SALESPARMLINE B WHERE ((B.DATAAREAID=@P3) AND (((B.PARMID=A.PARMID) AND (B.TABLEREFID=A.TABLEREFID)) AND (B.ORIGSALESID=A.ORIGSALESID)))) ORDER BY A.DATAAREAID,A.PARMID,A.DEL_SALESID</frame>
               <frame procname="unknown" line="1" sqlhandle="0x000000000000000000000000000000000000000000000000">unknown</frame>
            </executionStack>
            <inputbuf>(@P1 nvarchar(5),@P2 nvarchar(21),@P3 nvarchar(5))SELECT A.DEL_SALESID,A.SALESNAME,A.PARMID,A.ORIGSALESID,A.TABLEREFID,A.DEL_ORIGTABLEREFID,A.JOURNALREFTABLEID,A.JOURNALREFRECID,A.SUBID,A.CREATEDDATETIME,A.CREATEDBY,A.RECVERSION,A.RECID FROM SALESPARMSUBTABLE A WHERE ((A.DATAAREAID=@P1) AND (A.PARMID=@P2)) AND NOT EXISTS (SELECT 'x' FROM SALESPARMLINE B WHERE ((B.DATAAREAID=@P3) AND (((B.PARMID=A.PARMID) AND (B.TABLEREFID=A.TABLEREFID)) AND (B.ORIGSALESID=A.ORIGSALESID)))) ORDER BY A.DATAAREAID,A.PARMID,A.DEL_SALESID</inputbuf>
         </process>
         <process id="process572988" taskpriority="0" logused="5800" waitresource="PAGE: 16:1:16714223" waittime="1576" ownerId="207752211" transactionname="user_transaction" lasttranstarted="2016-05-07T07:58:32.530" XDES="0x865e1950" lockMode="S" schedulerid="3" kpid="21628" status="suspended" spid="154" sbid="0" ecid="0" priority="0" trancount="1" lastbatchstarted="2016-05-07T07:58:32.563" lastbatchcompleted="2016-05-07T07:58:32.560" clientapp="Microsoft Dynamics AX" hostname="*********" hostpid="19816" loginname="*********" isolationlevel="read committed (2)" xactid="207752211" currentdb="16" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
            <executionStack>
               <frame procname="adhoc" line="1" stmtstart="100" sqlhandle="0x02000000d3d2cf1665ba9e17ee49d6dd9bc2fbf295ad7168">SELECT A.DEL_SALESID,A.SALESNAME,A.PARMID,A.ORIGSALESID,A.TABLEREFID,A.DEL_ORIGTABLEREFID,A.JOURNALREFTABLEID,A.JOURNALREFRECID,A.SUBID,A.CREATEDDATETIME,A.CREATEDBY,A.RECVERSION,A.RECID FROM SALESPARMSUBTABLE A WHERE ((A.DATAAREAID=@P1) AND (A.PARMID=@P2)) AND NOT EXISTS (SELECT 'x' FROM SALESPARMLINE B WHERE ((B.DATAAREAID=@P3) AND (((B.PARMID=A.PARMID) AND (B.TABLEREFID=A.TABLEREFID)) AND (B.ORIGSALESID=A.ORIGSALESID)))) ORDER BY A.DATAAREAID,A.PARMID,A.DEL_SALESID</frame>
               <frame procname="unknown" line="1" sqlhandle="0x000000000000000000000000000000000000000000000000">unknown</frame>
            </executionStack>
            <inputbuf>(@P1 nvarchar(5),@P2 nvarchar(21),@P3 nvarchar(5))SELECT A.DEL_SALESID,A.SALESNAME,A.PARMID,A.ORIGSALESID,A.TABLEREFID,A.DEL_ORIGTABLEREFID,A.JOURNALREFTABLEID,A.JOURNALREFRECID,A.SUBID,A.CREATEDDATETIME,A.CREATEDBY,A.RECVERSION,A.RECID FROM SALESPARMSUBTABLE A WHERE ((A.DATAAREAID=@P1) AND (A.PARMID=@P2)) AND NOT EXISTS (SELECT 'x' FROM SALESPARMLINE B WHERE ((B.DATAAREAID=@P3) AND (((B.PARMID=A.PARMID) AND (B.TABLEREFID=A.TABLEREFID)) AND (B.ORIGSALESID=A.ORIGSALESID)))) ORDER BY A.DATAAREAID,A.PARMID,A.DEL_SALESID</inputbuf>
         </process>
      </process-list>
      <resource-list>
         <pagelock fileid="1" pageid="16714223" dbid="16" objectname="AX2009_****.dbo.SALESPARMLINE" id="lock562bdb480" mode="IX" associatedObjectId="72057635944464384">
            <owner-list>
               <owner id="process572988" mode="IX" />
            </owner-list>
            <waiter-list>
               <waiter id="process58d048" mode="S" requestType="convert" />
            </waiter-list>
         </pagelock>
         <pagelock fileid="1" pageid="16714223" dbid="16" objectname="AX2009_****.dbo.SALESPARMLINE" id="lock562bdb480" mode="IX" associatedObjectId="72057635944464384">
            <owner-list>
               <owner id="process58d048" mode="IX" />
            </owner-list>
            <waiter-list>
               <waiter id="process572988" mode="S" requestType="convert" />
            </waiter-list>
         </pagelock>
      </resource-list>
   </deadlock>
</deadlock-list>

【问题讨论】:

  • 这似乎表明提到的 SELECT 是将要发生更新的事务的一部分。您能否确认在同一交易中是否确实存在(潜在)更新?

标签: sql dynamics-ax-2009 database-deadlocks


【解决方案1】:

我认为我们不能仅仅通过知道死锁正在发生来解决死锁问题......我们需要知道为什么或什么过程正在发生。

它看起来像是清理操作或销售订单过帐,因为它正在寻找不存在 SalesParmLine 记录的 SalesParmTable 记录。您可以使用该查询在代码中查找 select 语句并向后工作以查看启动它的进程。

我认为更好的方法是,当它发生时,找出用户当时在做什么。检查批处理作业以查看两个批处理作业是否同时执行相同的操作。

您可以通过关注此博客找出导致此问题的用户/进程: https://blogs.msdn.microsoft.com/amitkulkarni/2011/08/10/finding-user-sessions-from-spid-in-dynamics-ax-2012/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多