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