以下のように、タイトルと呼ばれる非常に基本的なテーブルがあります。
TitleID - auto identity and PK
UserID - reference key to User table
Title - varchar
IsPrimary - bit
TitleID の PK Clustered Index である 1 つのインデックスのみ
今、ReadCommitted トランザクションのストアド プロシージャを介して、このテーブルにレコードを挿入しています。
このストアド プロシージャは、IsPrimary = 1 のテーブルにレコードを挿入し、他のすべてのタイトルを 0 に更新します。
INSERT INTO Titles(...)
VALUES (...)
UPDATE T
SET IsPrimary = 0
FROM Titles T
WHERE T.UserID = @UserID AND T.JobTitle != @Title
マルチユーザーシナリオでこれをテストした瞬間、デッドロックの問題が発生しました。ストアド プロシージャから UPDATE コマンドを削除すると、すべて正常に動作します...
ルックアップ列に非クラスター化インデックスを作成しようとしましたが、更新ステートメントで WITH (ROWLOCK) ヒントも試しましたが、何も機能していないようです。
SQLステートメントを実行して推定実行計画を表示すると、クラスター化インデックスの両方が更新されていることがわかり、これが複数ユーザーのシナリオで失敗する場所だと思います...
それはかなり単純なシナリオであり、多くの人がこの種の動作を高トランザクション システムで実装する必要があると思いますが、この問題にアプローチ/解決する方法について何も見つけることができません。あなたの助けに感謝します.
ありがとうございました。