Maison >base de données >tutoriel mysql >Comment garantir une gestion atomique et fiable des lignes dans T-SQL ?

Comment garantir une gestion atomique et fiable des lignes dans T-SQL ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-07 13:11:41432parcourir

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

Gestion atomique et fiable des lignes avec T-SQL

Pour maintenir l'intégrité d'un système de réservation, il est crucial de garantir que les mises à jour et les insertions sont atomiques et fiables. Une transaction atomique garantit que si plusieurs utilisateurs tentent de mettre à jour la même ligne simultanément, une seule mise à jour réussira, évitant ainsi les conditions de concurrence.

Supposons que vous ayez une table nommée « Réservations » avec un index unique sur le « FlightId ». colonne. Votre objectif est de créer une procédure stockée qui met à jour la colonne « TicketsBooked » pour un ID de vol spécifique. Si la ligne correspondant à cet identifiant de vol n'existe pas, vous devez l'insérer.

Voici comment réaliser cette opération atomique et fiable à l'aide de 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;

Ceci La procédure stockée utilise les instructions BEGIN TRANSACTION et COMMIT TRANSACTION pour définir la limite de la transaction. Au sein de la transaction, il vérifie d'abord si la ligne avec l'ID de vol spécifié existe à l'aide de l'instruction IF EXISTS. Si ce n'est pas le cas, l'instruction INSERT insère une nouvelle ligne.

Si la ligne existe, l'instruction UPDATE met à jour la colonne "TicketsBooked" uniquement si la valeur mise à jour ne dépasse pas la limite "TicketsMax". En utilisant une transaction, nous garantissons que la mise à jour ou l'insertion est validée avec succès, ou si une erreur se produit, la transaction est annulée.

Enfin, l'instruction CASE vérifie la variable globale @@ERROR pour déterminer la succès ou échec de la transaction et renvoie une valeur booléenne (VRAI ou FAUX) en conséquence.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn