SQL Server Profiler を使用してデッドロックの原因を特定しようとしています。デッドロック グラフは次のとおりです。
どちらのステートメントも挿入であり、
select scope_identity();
実際には 2 つの同時プロセスがあり、1 サイクルでinsert-select_identityを繰り返し実行します。
私が期待するのは、挿入がクラスター化されたインデックスに対して排他的ロックを取得し、選択が非クラスター化インデックスの共有ロックを取得し、それぞれのインデックスが解放されるのを待つことです。
私が見ているのは、両方のプロセスが同じリソース (クラスター化インデックス) が解放されるのを待っていることです。どうすればいいの?特定のリソースは、1 つのプロセスまたは別のプロセスに属する必要があります。ここで何が恋しいですか?事前にすべてに感謝します。
編集: はい、分離レベルはシリアライズ可能です。where
PS:おそらく、選択にステートメントが含まれていない限り、非クラスター化インデックスの共有ロックに関する私の仮定は間違っていました
Edit2: ここに xml の一部があります:
<resource-list>
<keylock hobtid="72057594148028416" dbid="29" objectname="<confidential>" indexname="PK_WP_Inbound_StockTransactionLine" id="lock9641700" mode="RangeS-S" associatedObjectId="72057594148028416">
<owner-list>
<owner id="process8e09288" mode="RangeS-S"/>
</owner-list>
<waiter-list>
<waiter id="process991ce08" mode="RangeI-N" requestType="convert"/>
</waiter-list>
</keylock>
<keylock hobtid="72057594148028416" dbid="29" objectname="<confidential>" indexname="PK_WP_Inbound_StockTransactionLine" id="lock9641700" mode="RangeS-S" associatedObjectId="72057594148028416">
<owner-list>
<owner id="process991ce08" mode="RangeS-S"/>
</owner-list>
<waiter-list>
<waiter id="process8e09288" mode="RangeI-N" requestType="convert"/>
</waiter-list>
</keylock>
</resource-list>
これによると、SERIALIZABLE分離によるRangeスキャンだと思います(ググった)。しかし、それでも、これがどのように発生するのか、推奨される解決策は何なのかわかりません。