データベースで複数の同時 CRUD 操作を実行している Java アプリケーションがあります。SQLServer のサポートを追加していますが、同時削除中のデッドロックに問題があります。調査の結果、問題は特定のテーブルでのロックのエスカレーションが原因である可能性があることがわかりました。
それを修正しようとして、デッドロックを回避できるように、UPDLOCK ヒントを使用して、問題のテーブルのすべての読み取りを「更新のために」行うことにしました。しかし、私はまだ問題を見ています。SQLServer でトレースを有効にしましたが、SQLServer ログに次のデッドロック トレースが見つかりました。
デッドロックが発生しました .... デッドロック情報の出力 グラフ待ち
ノード:1 キー: 5:72057594042384384 (54048e7b3828) CleanCnt:3 モード:X フラグ: 0x0 許可リスト 1: 所有者:0x03D08C40 モード: X フラグ:0x0 参照:0 ライフ:02000000 SPID:62 ECID:0 XactLockInfo: 0x04834274 SPID: 62 ECID: 0 ステートメント タイプ: DELETE 行番号: 1 入力 Buf: 言語イベント: (@P0 nvarchar(4000))delete from part_data where part_id = @P0 要求元: ResType:LockOwner Stype:'OR'Xdes:0x04B511C8 モード: U SPID:60 BatchID:0 ECID:0 TaskProxy:(0x058BE378) 値:0x3d08500 コスト:(0/1296)
ノード:2
キー: 5:72057594042384384 (f903d6d6e0ac) CleanCnt:2 モード:X フラグ: 0x0 許可リスト 0: 所有者:0x03D088A0 モード: X Flg:0x0 Ref:0 ライフ:02000000 SPID:60 ECID:0 XactLockInfo: 0x04B511EC SPID: 60 ECID: 0 ステートメント タイプ: DELETE 行番号: 1 入力 Buf: 言語イベント: (@P0 nvarchar(4000))delete from part_data where part_id = @P0 Requested By: ResType:LockOwner Stype:'OR'Xdes:0x04834250 Mode: U SPID: 62 BatchID:0 ECID:0 TaskProxy:(0x047BA378) 値:0x3d089e0 コスト:(0/4588)
犠牲者リソース所有者: ResType:LockOwner Stype:'OR'Xdes:0x04B511C8 モード: U SPID:60 BatchID:0 ECID:0 TaskProxy:(0x058BE378) 値:0x3d08500 コスト:(0/1296)
SQLServer プロファイラーは、これを 2 つのクライアントが更新 (U) ロックを保持し、排他 (X) ロックにエスカレートしようとしていると示しています。私が読んだ SQLServer のドキュメントでは、ある時点で 1 つのクライアントのみがテーブルを (U) ロックできると書かれているため、なぜトレースに示されている状況が表示されるのか疑問に思っています。
そのトレースで参照されているデータベース オブジェクトは、外部キーのインデックスです。この種の問題を修正した経験のある人がアドバイスを提供できれば、それは大きな助けになるでしょう.
ありがとう、ブラッド。
EDIT は、要求に応じてデッドロック グラフ xml を追加しました。
<deadlock-list>
<deadlock victim="process989018">
<process-list>
<process id="process6aa7a8" taskpriority="0" logused="4844" waitresource="KEY: 5:72057594042384384 (5504bdfb7529)" waittime="9859" ownerId="613553" transactionname="implicit_transaction" lasttranstarted="2009-05-08T11:52:39.137" XDES="0x5fcbc30" lockMode="U" schedulerid="1" kpid="3516" status="suspended" spid="59" sbid="0" ecid="0" priority="0" transcount="2" lastbatchstarted="2009-05-08T11:52:39.183" lastbatchcompleted="2009-05-08T11:52:39.183" clientapp="jTDS" hostname="LOIRE" hostpid="123" loginname="sa" isolationlevel="read committed (2)" xactid="613553" currentdb="5" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128058">
<executionStack>
<frame procname="adhoc" line="1" stmtstart="40" sqlhandle="0x0200000007c76c39efdd8317c6fa7b611b4fd958f05cfcf4">
delete from part_data where part_id = @P0 </frame>
</executionStack>
<inputbuf>(@P0 nvarchar(4000))delete from part_data where part_id = @P0</inputbuf>
</process>
<process id="process989018" taskpriority="0" logused="1528" waitresource="KEY: 5:72057594042384384 (5e0405cb0377)" waittime="1250" ownerId="613558" transactionname="implicit_transaction" lasttranstarted="2009-05-08T11:52:39.183" XDES="0x48318f0" lockMode="U" schedulerid="2" kpid="2692" status="suspended" spid="60" sbid="0" ecid="0" priority="0" transcount="2" lastbatchstarted="2009-05-08T11:52:39.183" lastbatchcompleted="2009-05-08T11:52:39.183" clientapp="jTDS" hostname="LOIRE" hostpid="123" loginname="sa" isolationlevel="read committed (2)" xactid="613558" currentdb="5" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128058">
<executionStack>
<frame procname="adhoc" line="1" stmtstart="40" sqlhandle="0x0200000007c76c39efdd8317c6fa7b611b4fd958f05cfcf4">
delete from part_data where part_id = @P0 </frame>
</executionStack>
<inputbuf>(@P0 nvarchar(4000))delete from part_data where part_id = @P0</inputbuf>
</process>
</process-list>
<resource-list>
<keylock hobtid="72057594042384384" dbid="5" objectname="MESSAGESTOREDB61.dbo.part_data" indexname="idx_part_data_part_id" id="lock3cab740" mode="X" associatedObjectId="72057594042384384">
<owner-list>
<owner id="process6aa7a8" mode="X"/>
</owner-list>
<waiter-list>
<waiter id="process989018" mode="U" requestType="wait"/>
</waiter-list>
</keylock>
<keylock hobtid="72057594042384384" dbid="5" objectname="MESSAGESTOREDB61.dbo.part_data" indexname="idx_part_data_part_id" id="lock3cad340" mode="X" associatedObjectId="72057594042384384">
<owner-list>
<owner id="process989018" mode="X"/>
</owner-list>
<waiter-list>
<waiter id="process6aa7a8" mode="U" requestType="wait"/>
</waiter-list>
</keylock>
</resource-list>
</deadlock>
</deadlock-list>