2016-05-18 15 views
0

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> 
+0

テーブル '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/)。 –

+0

@ FH-Inway申し訳ありませんが私の間違いはバッチと呼ばれるテーブルでした。私はそれらを見ていきます。ありがとう! –

+0

デッドロックを引き起こすバッチジョブを特定することをお勧めします。デッドロック中に実行中のバッチジョブを見てから、デッドロックが消えるまで1つずつ削除してください。最後に、デッドロックを引き起こす1つまたは2つの特定のバッチジョブが必要です。これらを次のステップについてここに報告してください。 –

答えて

0

SQLのデッドロック検出器からの情報は、我々は、X ++コード内で次のような構造の2つのSQL文を探していることを教えてくれるから抽出された情報です。

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])))))))) 


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])))) 

私は(更新のため)の方法serverProcessDependenciesにクラスBatchRunでこれらを見つけることができたし、(削除用)方法serverProcessFinishedJobs。これは、multithreadingを使用するバッチジョブが原因であることがわかります。マルチスレッドを使用するすぐに使えるバッチジョブがいくつかありますが、最も一般的に使用されるのはマスタースケジューリングバッチジョブです。しかし、あなたの問題は、マルチスレッドバッチジョブのカスタム実装が原因であると考えられます。

コメントに示唆されているように、デッドロックが発生したときに実行中のバッチジョブを見て、マルチスレッドを使用しているかどうか、およびカスタムバッチジョブであるかどうかを分析します。この分析を行うには、経験豊富な開発者が必要です。

Vincent16がDeadlock issue when running job in batch franeworkに提案するものは、バッチサーバーの「最大バッチスレッド」設定を1に設定し、1つのバッチサーバーのみを許可するものです。しかし、これはバッチ・ジョブのパフォーマンスに重大な影響を与える可能性があるため、本番環境で使用する前にテストしてください。

+0

これは本当に私たちを助けませんでした。私たちはインフラストラクチャのアップグレードに頼っていました。マイクロソフトからサポートを受け、デッドロックが最小限に抑えられましたが、依然として特定の状況で発生し、BATCHテーブルに関連しなくなりました。 –

関連する問題