アトミックで信頼性の高い行更新の確保: 存在の確認と存在しない場合の挿入
T-SQL ストアド プロシージャでは、更新を目的としています。テーブル内の行、または存在しない場合は挿入します。これは、アトミック性と信頼性が最優先される予約システムにとって非常に重要です。
行の存在の確認
指定された FlightId を持つ行が存在するかどうかを確認するには、 EXISTS 演算子:
IF EXISTS (SELECT * FROM Bookings WHERE FlightID = @Id)
行が存在する場合、内部クエリは空ではない結果を返し、 IF 条件が TRUE と評価されます。
行が存在しない場合の挿入
ELSE ブロック内で、行が存在しない場合は、挿入操作を実行できます。 :
INSERT INTO Bookings ... (omitted)
取り扱い条件違反
あなたの質問は、フライトごとに予約できる最大チケット数の制限を強制する必要性を強調しています。これは、UPDATE ステートメントの TicketsMax 列をチェックすることで実現できます。
UPDATE Bookings SET TicketsBooked = TicketsBooked + @TicketsToBook WHERE FlightId = @Id AND TicketsMax < (TicketsBooked + @TicketsToBook)
条件に違反した場合 (つまり、すでに予約されているチケットが多すぎる場合)、UPDATE は失敗し、FALSE を返すことができます。操作の失敗を示します。
トランザクション管理
原子性と信頼性を確保するには、操作をトランザクション内に含めます。
BEGIN TRANSACTION -- Perform operations (update/insert/condition check) IF @@error = 0 BEGIN COMMIT TRANSACTION RETURN TRUE END ELSE BEGIN ROLLBACK TRANSACTION RETURN FALSE END
@@error システム変数は、データベース操作の成功または失敗を示します。エラーが発生した場合 (@@error ≠ 0)、トランザクションはロールバックされ、FALSE が返されます。それ以外の場合、トランザクションはコミットされ、予約が成功したことを示す TRUE が返されます。
以上が最大予約制限を処理して、T-SQL で行をアトミックに更新または挿入する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。