ホームページ > データベース > mysql チュートリアル > T-SQL でアトミックで信頼性の高い行処理を保証するにはどうすればよいですか?

T-SQL でアトミックで信頼性の高い行処理を保証するにはどうすればよいですか?

Patricia Arquette
リリース: 2025-01-07 13:11:41
オリジナル
414 人が閲覧しました

How to Guarantee Atomic and Reliable Row Handling in T-SQL?

T-SQL によるアトミックで信頼性の高い行処理

予約システムの整合性を維持するには、更新と挿入が確実に行われるようにすることが重要です。アトミックで信頼性があります。アトミック トランザクションにより、複数のユーザーが同じ行を同時に更新しようとしても 1 つの更新だけが成功することが保証され、競合状態が防止されます。

「FlightId」に一意のインデックスを持つ「Bookings」という名前のテーブルがあるとします。カラム。目標は、特定のフライト ID の「TicketsBooked」列を更新するストアド プロシージャを作成することです。そのフライト ID に対応する行が存在しない場合は、それを挿入する必要があります。

T-SQL を使用してこのアトミックで信頼性の高い操作を実現する方法は次のとおりです。

-- BEGIN TRANSACTION
BEGIN TRANSACTION;

-- Check if the row exists
IF EXISTS (SELECT * FROM Bookings WHERE FlightID = @Id)
BEGIN
    -- Update the existing row
    UPDATE Bookings
    SET TicketsBooked = TicketsBooked + @TicketsToBook
    WHERE FlightID = @Id AND TicketsMax < (TicketsBooked + @TicketsToBook);
END
ELSE
BEGIN
    -- Insert a new row
    INSERT INTO Bookings (FlightID, TicketsBooked) VALUES (@Id, @TicketsToBook);
END;

-- COMMIT TRANSACTION
COMMIT TRANSACTION;

-- Return success (TRUE)
SELECT CASE WHEN @@ERROR = 0 THEN 1 ELSE 0 END AS Success;
ログイン後にコピー

これストアド プロシージャは、BEGIN TRANSACTION ステートメントと COMMIT TRANSACTION ステートメントを使用してトランザクション境界を定義します。トランザクション内では、まず、IF EXISTS ステートメントを使用して、指定されたフライト ID を持つ行が存在するかどうかを確認します。存在しない場合、INSERT ステートメントは新しい行を挿入します。

行が存在する場合、更新された値が "TicketsMax" 制限を超えない場合にのみ、UPDATE ステートメントは "TicketsBooked" 列を更新します。トランザクションを使用することで、更新または挿入が正常にコミットされるか、エラーが発生した場合はトランザクションがロールバックされることを確認します。

最後に、CASE ステートメントは @@ERROR グローバル変数をチェックして、トランザクションの成功または失敗を示し、それに応じてブール値 (TRUE または FALSE) を返します。

以上がT-SQL でアトミックで信頼性の高い行処理を保証するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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