1

以下のように、タイトルと呼ばれる非常に基本的なテーブルがあります。

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ステートメントを実行して推定実行計画を表示すると、クラスター化インデックスの両方が更新されていることがわかり、これが複数ユーザーのシナリオで失敗する場所だと思います...

それはかなり単純なシナリオであり、多くの人がこの種の動作を高トランザクション システムで実装する必要があると思いますが、この問題にアプローチ/解決する方法について何も見つけることができません。あなたの助けに感謝します.

ありがとうございました。

4

1 に答える 1

0

デッドロックはおそらくインデックス リソースにあります。

実行計画では、ブックマーク/キー検索を探し、それらのフィールドをカバーする非クラスター化インデックスを作成します。これにより、UPDATE のデータの「読み取り」が INSERT の「書き込み」と競合しなくなります。

于 2012-05-24T13:39:40.063 に答える