4

デフォルトの「READCOMMITED」トランザクションの下で、フラットなプレーンテーブルでの愚かな単純なSQLUPDATEクエリによって引き起こされるいくつかの面白いデッドロックがあります。

UPDATE table SET column=@P1 WHERE PK=@P2

PKvarchar(11)、クラスター化インデックスがあります。テーブルにトリガーやテーブルの関係などはありません。

いくつかのチェックを行ったところ、デッドロックはROW /レコードレベルではなく、「PAGE」レベルで発生していることがわかりました。次に、更新クエリごとに、100(およびそれ以上)のPAGEロックが必要であることがわかりました。(一度に1つの行を更新しているので、意味がありません)

デッドロックの発生を防ぐ方法はありますか?または、カーソルを使用せずに1行の更新に必要なロックの数をどのように減らすことができますか?

-

あなたの提案をありがとう。

フィルファクターを高くしたり低くしたりして、インデックスを数回再構築しようとしました。プロセスに異なる位置/スライスを更新させようとしました。しかし、何も改善も最悪もありませんでした。

-

SQLServerプロファイラーを試しました。「Lock:DeadlockChain」と「Lock:Deadlock」をキャプチャしましたが、「DeadlockGraph」はキャプチャされませんでした。どちらの側も、読み取りコミット、自動コミットモードで単純な更新クエリを実行しています。

Lock:Deadlock Chain 17887475    1       0X01    4   myserver        2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                                                                 0           971497  102 - Resource type Exchange                    Lock:Deadlock Chain 17887476    1       0X01    4   myserver        2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:438102                                                                                                                                                                                                                                                          265006271       0   0X56AF060001000000000000001B0006        27              0 - LOCK    4 - U           0   72057594040352768   1 - TRANSACTION 0   6 - PAGE    mydatabase  971497  101 - Resource type Lock                
Lock:Deadlock Chain 17887477    1       0X01    4   myserver        2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                                                                 0           971497  102 - Resource type Exchange                    Lock:Deadlock Chain 17887478    1       0X01    4   myserver        2008-11-28 10:16:46.210 Deadlock Chain SPID = 54 1:426206                                                                                                                                                                                                                                                           265006240       0   0XDE80060001000000000000001B0006        27              0 - LOCK    4 - U           0   72057594040352768   1 - TRANSACTION 0   6 - PAGE    mydatabase  971497  101 - Resource type Lock                
Lock:Deadlock Chain 17887479    1       0X01    4   myserver        2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:426206                                                                                                                                                                                                                                                          265006271       0   0XDE80060001000000000000001B0006        27              0 - LOCK    4 - U           0   72057594040352768   1 - TRANSACTION 0   6 - PAGE    mydatabase  971497  101 - Resource type Lock                
Lock:Deadlock Chain 17887480    1       0X01    4   myserver        2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                                                                 0           971497  102 - Resource type Exchange                    Lock:Deadlock Chain 17887481    1       0X01    4   myserver        2008-11-28 10:16:46.210 Deadlock Chain SPID = 54 1:426066                                                                                                                                                                                                                                                           265006240       0   0X5280060001000000000000001B0006        27              0 - LOCK    4 - U           0   72057594040352768   1 - TRANSACTION 0   6 - PAGE    mydatabase  971497  101 - Resource type Lock                
Lock:Deadlock Chain 17887482    1       0X01    4   myserver        2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:426066                                                                                                                                                                                                                                                          265006271       0   0X5280060001000000000000001B0006        27              0 - LOCK    4 - U           0   72057594040352768   1 - TRANSACTION 0   6 - PAGE    mydatabase  971497  101 - Resource type Lock                
Lock:Deadlock Chain 17887483    1       0X01    4   myserver        2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                                                                 0           971497  102 - Resource type Exchange                    Lock:Deadlock Chain 17887484    1       0X01    4   myserver        2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:425614                                                                                                                                                                                                                                                          265006271       0   0X8E7E060001000000000000001B0006        27              0 - LOCK    4 - U           0   72057594040352768   1 - TRANSACTION 0   6 - PAGE    mydatabase  971497  101 - Resource type Lock                
Lock:Deadlock Chain 17887485    1       0X01    4   myserver        2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                                                                 0           971497  102 - Resource type Exchange                    Lock:Deadlock Chain 17887486    1       0X01    4   myserver        2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:426687                                                                                                                                                                                                                                                          265006271       0   0XBF82060001000000000000001B0006        27              0 - LOCK    4 - U           0   72057594040352768   1 - TRANSACTION 0   6 - PAGE    mydatabase  971497  101 - Resource type Lock                
Lock:Deadlock Chain 17887487    1       0X01    4   myserver        2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                                                                 0           971497  102 - Resource type Exchange                
Lock:Deadlock Chain 17887488    1       0X01    4   myserver        2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:425392                                                                                                                                                                                                                                                          265006271       0   0XB07D060001000000000000001B0006        27              0 - LOCK    4 - U           0   72057594040352768   1 - TRANSACTION 0   6 - PAGE    mydatabase  971497  101 - Resource type Lock                
Lock:Deadlock Chain 17887489    1       0X01    4   myserver        2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                                                                 0           971497  102 - Resource type Exchange                
Lock:Deadlock Chain 17887491    1       0X01    4   myserver        2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                                                                 0           971497  102 - Resource type Exchange                
Lock:Deadlock Chain 17887493    1       0X01    4   myserver        2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                                                                 0           971497  102 - Resource type Exchange                
Lock:Deadlock Chain 17887494    1       0X01    4   myserver        2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:435792                                                                                                                                                                                                                                                          265006271       0   0X50A6060001000000000000001B0006        27              0 - LOCK    4 - U           0   72057594040352768   1 - TRANSACTION 0   6 - PAGE    mydatabase  971497  101 - Resource type Lock                
Lock:Deadlock Chain 17887495    1       0X01    4   myserver        2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                                                                 0           971497  102 - Resource type Exchange                
Lock:Deadlock Chain 17887496    1       0X01    4   myserver        2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:438206                                                                                                                                                                                                                                                          265006271       0   0XBEAF060001000000000000001B0006        27              0 - LOCK    4 - U           0   72057594040352768   1 - TRANSACTION 0   6 - PAGE    mydatabase  971497  101 - Resource type Lock                
Lock:Deadlock   17887497        myuser  0XCD85FBB269700B4AA2F4E8579D118999  209 myserver    myuser  2008-11-28 10:16:45.930 1:426206    265006271   myapps  0   0XDE80060001000000000000001B0006    123 27  281 2008-11-28 10:16:46.210 myclient    0 - LOCK    4 - U           0   72057594040352768   1 - TRANSACTION 0   6 - PAGE    mydatabase  971498                  
4

6 に答える 6

5

ロックのエスカレーションを減らすには、次の 2 つのオプションがあります。

1)WITH(ROWLOCK)ヒントを追加して、SQLサーバーにより細かい粒度のロックを取得するように依頼します(マイレージは異なる場合があります:

UPDATE table WITH (ROWLOCK) SET column=@P1 WHERE PK=@P2; PK varchar(11) にはクラスター化インデックスがあります。テーブルにティガーやテーブル関係などはありません。

2) 行をランダムな順序で更新します。これにより、行ロックがページ ロックにエスカレートされる可能性が低くなります。

また、そのテーブルのインデックスが最新であることを確認すると、多くの場合、ロックを減らすことができます。多くの挿入を行う場合は、Fill factor (90 が適切) を残すことができます。

于 2008-11-26T15:17:57.360 に答える
1

プロファイル トレースを実行しましたか?

SQL プロファイラーを起動し、次のイベントを追加して標準トレースを作成します。

  • ロック:デッドロック グラフ
  • ロック:ロック:デッドロック チェーン
  • ロック:ロック:エスカレーション

デッドロックの正確な性質の詳細を提供する必要があります。

于 2008-11-27T03:43:21.147 に答える
0

テーブルに UPDATE TRIGGER がありますか? その場合、トリガーのアクションがデッドロックを引き起こしている可能性があります。

于 2008-12-29T17:00:27.337 に答える
0

通常の単純なケースでは、このタイプの振る舞いはあまり見られません。あなたへの私の質問はこれです: この取引の「反対側」には何がありますか? 実行中で、このデッドロックの原因となっている他の更新ステートメントは何ですか? それが、この問題を診断する鍵になると思います。正直なところ、私のお金はこの別のものにあり、これまで正体不明のクエリが原因です。そして私は今ベガスにいます...

于 2008-11-26T16:30:48.383 に答える
0

updateステートメントの前に、同じトランザクション内で同じテーブルおよび同じレコードからどのselectステートメントが発生しますか? これらの選択で (updlock) ロック ヒントを使用します。

于 2008-11-27T15:15:22.950 に答える
0

最後に、ストアド プロシージャで cusror を使用して回避策を講じる必要があります。

しかし、ページロックがどのように発生し、どのように解決するかは依然として興味深いものです。


Googleでさらに検索した後、同じ問題を抱えている他の人が何人かいて、(MSDNフォーラムから) SQL Server 2005で並列処理をオフにすることを提案していますが、試す機会がありません.

于 2009-01-22T15:41:32.993 に答える