SQL Server 注文キューの競合状態の回避
複数の注文プロセッサがストアド プロシージャ経由で注文キューにアクセスし、それぞれ 20 件の注文を取得します。 これにより、複数のプロセッサが同じ順序を取得する競合状態が発生し、処理エラーが発生する可能性があります。
この同時実行の問題を解決する解決策は次のとおりです:
1 つのアプローチでは、READPAST
ヒントを使用してロックされた行をバイパスし、ロックのエスカレーションを防ぐための ROWLOCK
と排他的な行ロックのための UPDLOCK
を組み合わせます。 これにより、各プロセッサが行の個別のバッチをロックできるようになります (例: プロセッサ 1 は行 1 ~ 20 をロックし、プロセッサ 2 は行 21 ~ 40 をロックするなど)。
変更されたストアド プロシージャは次のようになります:
<code class="language-sql">UPDATE TOP (20) foo SET ProcessorID = @PROCID FROM OrderTable foo WITH (ROWLOCK, READPAST, UPDLOCK) WHERE ProcessorID = 0;</code>
もう 1 つの方法では、OUTPUT
句を使用します。これにより、SELECT
操作と UPDATE
操作が 1 つのアトミック ステートメントに結合され、更新された行をプロセッサーが即座に利用できることが保証されます。 これにより、SELECT
と UPDATE
を個別に操作する必要がなくなり、競合状態が防止されます。
以上がSQL Server キューからの注文を処理する際の競合状態を防ぐにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。