複数のプロセッサが同じレコードを取得しているため、注文処理システムで競合状態が発生しています。 これを修正する方法は次のとおりです:
問題の理解:
この問題は、ストアド プロシージャが、個別にロックされたビューからの選択と組み合わせた ROWLOCK
ヒントを使用することに起因します。これにより、複数のプロセッサが同じレコードをロックすることができ、データ破損が発生する可能性があります。
ヒントを使用した解決策:
競合状態を解決するには、READPAST
および UPDLOCK
ヒントを使用します。
<code class="language-sql">BEGIN TRAN UPDATE TOP (20) OrderTable foo SET ProcessorID = @PROCID FROM foo WITH (ROWLOCK, READPAST, UPDLOCK) WHERE ProcessorID = 0 COMMIT TRAN SELECT OrderID, ProcessorID, etc... FROM OrderTable WHERE ProcessorID = @PROCID</code>
READPAST
は、選択中の行のロックを回避し、クエリの継続的な実行を保証します。 UPDLOCK
は更新中の適切なロックを保証し、同時変更を防ぎます。
より効率的なソリューション:
より合理化されたアプローチでは、OUTPUT
句を使用して SELECT
と UPDATE
の操作を組み合わせます。
<code class="language-sql">BEGIN TRAN UPDATE TOP (20) foo OUTPUT OrderID, ProcessorID, etc... SET ProcessorID = @PROCID FROM foo WITH (ROWLOCK, UPDLOCK, READPAST) WHERE ProcessorID = 0 COMMIT TRAN</code>
これにより、別の SELECT
ステートメントが不要になり、効率とコードの明瞭さが向上します。
以上が重複したレコードの取得による注文処理における SQL Server の競合状態を解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。