ホームページ > データベース > mysql チュートリアル > 重複したレコードの取得による注文処理における SQL Server の競合状態を解決するにはどうすればよいですか?

重複したレコードの取得による注文処理における SQL Server の競合状態を解決するにはどうすればよいですか?

Patricia Arquette
リリース: 2025-01-18 01:22:10
オリジナル
578 人が閲覧しました

How Can I Resolve a SQL Server Race Condition in Order Processing Due to Duplicate Record Retrieval?

注文処理における SQL Server の競合状態への対処

複数のプロセッサが同じレコードを取得しているため、注文処理システムで競合状態が発生しています。 これを修正する方法は次のとおりです:

問題の理解:

この問題は、ストアド プロシージャが、個別にロックされたビューからの選択と組み合わせた 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 句を使用して SELECTUPDATE の操作を組み合わせます。

<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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート