Microsoft Dynamics AX 2012 R2を使用しており、複数のAOSサーバーを使用しており、場合によっては特定のテーブルのデッドロックを経験しています。 SQLデッドロック検出機能を使用して調査中です。両方がテーブルBATCHにアクセスしている複数のAOS(Dynamics AX 2012 R2)によるデッドロック
AOS1 psid XX (Delete) -><- AOS2 psid XX (Update)
。 AOS1が更新操作を行っている間、AOS1は削除操作を行っています。
私はDynamics AXには技術的なものではありませんが、これが構成設定かどうか、またはDynamics AXで複数のAOSを使用できることがわかっている理由がわかりますか?今のところ、これを避けるために単一のAOSを使用することを考えています。 TIA!
UPDATE:ここではSQLデッドロック検出器
<EVENT_INSTANCE>
<EventType>DEADLOCK_GRAPH</EventType>
<PostTime>2016-05-18T08:23:26.457</PostTime>
<SPID>31</SPID>
- <TextData>
- <deadlock-list>
- <deadlock victim="process187b921088">
- <process-list>
- <process id="process187b921088" taskpriority="0" logused="0" waitresource="KEY: 5:72057594054180864 (1012d480fedd)" waittime="1388" ownerId="7211112518" transactionname="user_transaction" lasttranstarted="2016-05-18T08:23:25.067" XDES="0x1561eaf0a0" lockMode="S" schedulerid="18" kpid="4772" status="suspended" spid="151" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2016-05-18T08:23:25.070" lastbatchcompleted="2016-05-18T08:23:25.070" lastattention="2016-05-16T15:37:08.080" clientapp="Microsoft Dynamics AX" hostname="XXX-PRODAOS3" hostpid="3796" loginname="XXX\axaos" isolationlevel="read committed (2)" xactid="7211112518" currentdb="5" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
- <executionStack>
<frame procname="adhoc" line="1" stmtstart="212" stmtend="1406" sqlhandle="0x0200000068d839079e1e808253171c305e0cb77c0e699b800000000000000000000000000000000000000000">unknown</frame>
</executionStack>
<inputbuf>(@P1 int,@P2 datetime2,@P3 int,@P4 int,@P5 int,@P6 int,@P7 int,@P8 int,@P9 int,@P10 int,@P11 int,@P12 int)UPDATE BATCH SET [email protected],[email protected],[email protected] WHERE (([email protected]) AND ([email protected])) AND EXISTS (SELECT 'x' FROM BATCHJOB T2 WITH (READCOMMITTEDLOCK) WHERE (([email protected]) AND (BATCH.BATCHJOBID=T2.RECID)) AND NOT (EXISTS (SELECT 'x' FROM BATCHCONSTRAINTS T3 WITH (READCOMMITTEDLOCK) WHERE EXISTS (SELECT 'x' FROM BATCH T4 WITH (READCOMMITTEDLOCK) WHERE (((T3.DEPENDSONBATCHID=T4.RECID) AND (T3.BATCHID=BATCH.RECID)) AND ((((T4.STATUS<>@P7) AND (T4.STATUS<>@P8)) OR (([email protected]) AND ([email protected]))) OR (([email protected]) AND ([email protected]))))))))</inputbuf>
</process>
- <process id="process187b911848" taskpriority="0" logused="1496" waitresource="KEY: 5:72057594054967296 (1f6c1d9698d0)" waittime="1339" ownerId="7211110381" transactionname="user_transaction" lasttranstarted="2016-05-18T08:23:25.050" XDES="0x187b9610d0" lockMode="U" schedulerid="16" kpid="2028" status="suspended" spid="87" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2016-05-18T08:23:25.117" lastbatchcompleted="2016-05-18T08:23:25.117" lastattention="1900-01-01T00:00:00.117" clientapp="Microsoft Dynamics AX" hostname="XXX-PRODAOS2" hostpid="3292" loginname="XXX\axaos" isolationlevel="read committed (2)" xactid="7211110381" currentdb="5" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
- <executionStack>
<frame procname="adhoc" line="1" stmtstart="50" stmtend="448" sqlhandle="0x020000007a68dc3969bbab373f6d3381cb08da5d66262e300000000000000000000000000000000000000000">unknown</frame>
</executionStack>
<inputbuf>(@P1 int,@P2 int,@P3 int)DELETE FROM BATCH WHERE EXISTS (SELECT 'x' FROM BATCHJOB T2 WITH (READCOMMITTEDLOCK) WHERE ((([email protected]) AND (BATCH.BATCHJOBID=T2.RECID)) AND (([email protected]) OR ([email protected]))))</inputbuf>
</process>
</process-list>
- <resource-list>
- <keylock hobtid="72057594054180864" dbid="5" objectname="TPI_AxNew_Prod.dbo.BATCHJOB" indexname="I_2096RECID" id="lockf9d3e0580" mode="X" associatedObjectId="72057594054180864">
- <owner-list>
<owner id="process187b911848" mode="X" />
</owner-list>
- <waiter-list>
<waiter id="process187b921088" mode="S" requestType="wait" />
</waiter-list>
</keylock>
- <keylock hobtid="72057594054967296" dbid="5" objectname="TPI_AxNew_Prod.dbo.BATCH" indexname="I_2827BATCHJOBID" id="lock15d81c0a80" mode="U" associatedObjectId="72057594054967296">
- <owner-list>
<owner id="process187b921088" mode="U" />
</owner-list>
- <waiter-list>
<waiter id="process187b911848" mode="U" requestType="wait" />
</waiter-list>
</keylock>
</resource-list>
</deadlock>
</deadlock-list>
</TextData>
<TransactionID />
<LoginName>sa</LoginName>
<StartTime>2016-05-18T08:23:26.457</StartTime>
<ServerName>XXX-AXDB2</ServerName>
<LoginSid>AQ==</LoginSid>
<EventSequence>546028</EventSequence>
<IsSystem>1</IsSystem>
<SessionLoginName />
</EVENT_INSTANCE>
テーブル 'WHSEBATCH'はカスタマイズされているようですが(そうでなければ、テーブルが存在するAX 2012バージョンを追加してください)、このテーブルの周りのロジックの分析とデバッグをお勧めします。 [Optimistic Concurrency Control(AX 2012)](https://msdn.microsoft.com/en-us/library/bb190073.aspx)と[AX 2012:バッチジョブとサービス操作のデバッグ方法] (https://dynamicsaxinsight.wordpress.com/2014/03/10/ax-2012-how-to-debug-batch-jobs-and-service-operations/)。 –
@ FH-Inway申し訳ありませんが私の間違いはバッチと呼ばれるテーブルでした。私はそれらを見ていきます。ありがとう! –
デッドロックを引き起こすバッチジョブを特定することをお勧めします。デッドロック中に実行中のバッチジョブを見てから、デッドロックが消えるまで1つずつ削除してください。最後に、デッドロックを引き起こす1つまたは2つの特定のバッチジョブが必要です。これらを次のステップについてここに報告してください。 –