0

私はデッドロックの専門家ではありませんが、私が見ていることは私にはあまり意味がありません。2 つの異なるプロセスが同じオブジェクトでデッドロックしているようです。1 つのプロセスは、リソースが解放されるのを待って、リソースの寿命を延ばすだけではありませんか? 通常、デッドロックには2つのリソースが関係しているため、混乱しています。

デッドロック:

<deadlock-list>
 <deadlock victim="process53f288">
  <process-list>
   <process id="process53f288" taskpriority="0" logused="264" waitresource="KEY: 7:72057594065977344 (651c594e0a33)" waittime="4406" ownerId="293044707" transactionname="user_transaction" lasttranstarted="2013-10-03T15:41:21.040" XDES="0x80cd53c0" lockMode="X" schedulerid="1" kpid="14284" status="suspended" spid="92" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2013-10-03T15:41:21.560" lastbatchcompleted="2013-10-03T15:41:21.553" clientapp=".Net SqlClient Data Provider" hostname="MCCMTLMCS001" hostpid="2952" loginname="asapdb" isolationlevel="read committed (2)" xactid="293044707" currentdb="7" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
    <executionStack>
     <frame procname="adhoc" line="1" stmtstart="34" sqlhandle="0x0200000065487b054151f9a8d40f9f90d40cba7ff11e6228">
UPDATE InnoPickCaseList SET DestinationSpiral = @p0 WHERE Sequence = @p1     </frame>
     <frame procname="unknown" line="1" sqlhandle="0x000000000000000000000000000000000000000000000000">
unknown     </frame>
    </executionStack>
    <inputbuf>
(@p0 int,@p1 int)UPDATE InnoPickCaseList SET DestinationSpiral = @p0 WHERE Sequence = @p1    </inputbuf>
   </process>
   <process id="process7ed948" taskpriority="0" logused="4556" waitresource="KEY: 7:72057594065977344 (62b5bdcd3e80)" waittime="4403" ownerId="293044717" transactionname="user_transaction" lasttranstarted="2013-10-03T15:41:21.050" XDES="0x1298df950" lockMode="X" schedulerid="4" kpid="7344" status="suspended" spid="94" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2013-10-03T15:41:21.560" lastbatchcompleted="2013-10-03T15:41:21.557" clientapp=".Net SqlClient Data Provider" hostname="MCCMTLMCS001" hostpid="2952" loginname="asapdb" isolationlevel="read committed (2)" xactid="293044717" currentdb="7" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
    <executionStack>
     <frame procname="adhoc" line="1" stmtstart="34" sqlhandle="0x0200000065487b054151f9a8d40f9f90d40cba7ff11e6228">
UPDATE InnoPickCaseList SET DestinationSpiral = @p0 WHERE Sequence = @p1     </frame>
     <frame procname="unknown" line="1" sqlhandle="0x000000000000000000000000000000000000000000000000">
unknown     </frame>
    </executionStack>
    <inputbuf>
(@p0 int,@p1 int)UPDATE InnoPickCaseList SET DestinationSpiral = @p0 WHERE Sequence = @p1    </inputbuf>
   </process>
  </process-list>
  <resource-list>
   <keylock hobtid="72057594065977344" dbid="7" objectname="ExactaDB.dbo.InnoPickCaseList" indexname="PK_InnoPickCaseList" id="locka7110b00" mode="X" associatedObjectId="72057594065977344">
    <owner-list>
     <owner id="process7ed948" mode="X"/>
    </owner-list>
    <waiter-list>
     <waiter id="process53f288" mode="X" requestType="wait"/>
    </waiter-list>
   </keylock>
   <keylock hobtid="72057594065977344" dbid="7" objectname="ExactaDB.dbo.InnoPickCaseList" indexname="PK_InnoPickCaseList" id="lockbb807a80" mode="X" associatedObjectId="72057594065977344">
    <owner-list>
     <owner id="process53f288" mode="X"/>
    </owner-list>
    <waiter-list>
     <waiter id="process7ed948" mode="X" requestType="wait"/>
    </waiter-list>
   </keylock>
  </resource-list>
 </deadlock>
</deadlock-list>

グラフ

ここに画像の説明を入力

追加の詳細

  • InnoPickCaseList.Sequence はテーブルの主キーであり、クラスター化されたインデックスがあります
  • 通常、テーブルには約 10,000 レコードが含まれます

特定のアプリケーションが更新を行う方法が原因で問題が発生していると思います。基本的に、トランザクション内で同じデータ セット (InnoPickCaseList.Sequence 番号の範囲) を更新できる 2 つの異なるスレッドがありますが、異なる順序で更新を実行している可能性があります。この時点で、更新が同じ順序で行われるように、2 つの異なるスレッド間で同じ方法でデータを並べ替えるように変更しました。

4

1 に答える 1