Points d'enregistrement d'une transaction

Les points d'enregistrement permettent de restaurer des parties des transactions. Vous pouvez créer un point d'enregistrement à l'aide de l'instruction SAVE TRANSACTION savepoint_name. Vous avez la possibilité par la suite d'exécuter une instruction ROLLBACK TRANSACTION savepoint_name pour annuler les opérations qui suivent le point d'enregistrement sans annuler la transaction depuis le début.

Les points d'enregistrement sont particulièrement utiles lorsque des erreurs sont peu susceptibles de se produire. En cas d'erreur peu fréquente, l'utilisation d'un point d'enregistrement pour restaurer une partie d'une transaction peut s'avérer plus efficace que de demander à chaque transaction de tester si une mise à jour est valide avant de procéder à la mise à jour. Les mises à jour et les restaurations sont des opérations coûteuses. Par conséquent, pour que les points d'enregistrement soient efficaces, la probabilité d'une erreur doit être basse et le coût de la vérification antérieure de la validité d'une mise à jour relativement élevé.

L'exemple qui suit illustre l'utilisation d'un point d'enregistrement dans un système de gestion de commandes où le risque de rupture de stock est faible car la société dispose de fournisseurs efficaces et de points de renouvellement de stock. En principe, l'application devrait vérifier que le stock est suffisant avant d'essayer de mettre à jour l'enregistrement correspondant à la commande. On supposera pour cet exemple que, pour une raison quelconque, la vérification préalable du stock disponible est relativement coûteuse (en raison d'une connexion par modem ou WAN peu rapide). L'application peut être codée pour effectuer simplement la modification, et annuler la modification si une erreur indiquant que le stock est insuffisant se produit. Dans ce cas, un simple test de la valeur de @@ERROR après la modification est bien plus rapide que la vérification préalable de la quantité commandée.

La table InvCtrl comporte une contrainte CHECK qui déclenche une erreur 547 si la valeur de la colonne QtyInStk devient négative. La procédure OrderStock crée un point de sauvegarde. Si une erreur 547 se produit, elle annule la transaction à partir du point d'enregistrement et retourne le nombre d'éléments disponibles au processus appelant. Celui-ci peut alors repasser une commande pour la quantité disponible. Si la procédure OrderStock retourne une valeur égale à 0, elle vérifie auprès du processus appelant que le stock disponible est suffisant pour honorer la commande.

SET NOCOUNT OFF;
GO
USE AdventureWorks2008R2;
GO
CREATE TABLE InvCtrl
    (WhrhousID      int,
    PartNmbr      int,
    QtyInStk      int,
    ReordrPt      int,
    CONSTRAINT InvPK PRIMARY KEY
    (WhrhousID, PartNmbr),
    CONSTRAINT QtyStkCheck CHECK (QtyInStk > 0) );
GO
CREATE PROCEDURE OrderStock
    @WhrhousID int,
    @PartNmbr int,
    @OrderQty int
AS
    DECLARE @ErrorVar int;
    SAVE TRANSACTION StkOrdTrn;
    UPDATE InvCtrl SET QtyInStk = QtyInStk - @OrderQty
        WHERE WhrhousID = @WhrhousID
        AND PartNmbr = @PartNmbr;
    SELECT @ErrorVar = @@error;
    IF (@ErrorVar = 547)
    BEGIN
        ROLLBACK TRANSACTION StkOrdTrn;
        RETURN (SELECT QtyInStk
                FROM InvCtrl
                WHERE WhrhousID = @WhrhousID
                AND PartNmbr = @PartNmbr);
    END
    ELSE
        RETURN 0;
GO