Remarque
L’accès à cette page requiert une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page requiert une autorisation. Vous pouvez essayer de modifier des répertoires.
S’applique à :SQL Server
Azure SQL Database
Azure SQL Managed Instance
Base de données SQL dans Microsoft Fabric
Définit un point de sauvegarde à l'intérieur d'une transaction.
Conventions de la syntaxe Transact-SQL
Syntax
SAVE { TRAN | TRANSACTION } { savepoint_name | @savepoint_variable }
[ ; ]
Arguments
savepoint_name
Nom affecté au point de sauvegarde. Les noms des points de sauvegarde doivent respecter les règles d'appellation des identificateurs, à la différence que leur nom est limité à 32 caractères. savepoint_name respecte toujours la casse, même si l’instance du moteur de base de données n’est pas sensible à la casse.
@savepoint_variable
Nom d'une variable définie par l'utilisateur et contenant un nom de point de sauvegarde valide. La variable doit être déclarée avec un type de données char, varchar, nchar ou nvarchar. Plus de 32 caractères peuvent être passés à la variable, mais seuls les 32 premiers caractères sont utilisés.
Remarks
Vous pouvez définir un point d’enregistrement dans une transaction. Le point d’enregistrement définit un état de cohérence auquel une transaction peut retourner si une partie de la transaction est annulée de manière conditionnelle. Si une transaction est restaurée dans un point d’enregistrement, elle doit passer à l’exécution avec plus d’instructions Transact-SQL si nécessaire et une COMMIT TRANSACTION instruction, ou elle doit être annulée complètement en remettant la transaction à son début. Pour annuler une transaction entière, utilisez le formulaire ROLLBACK TRANSACTION transaction_name. Toutes les instructions ou procédures de la transaction sont ainsi annulées.
Les noms de point de sauvegarde dupliqués sont autorisés dans une transaction, mais une ROLLBACK TRANSACTION instruction qui spécifie le nom du point d’enregistrement annule uniquement la transaction à l’aide de ce nom le plus récent SAVE TRANSACTION .
SAVE TRANSACTION n’est pas pris en charge dans les transactions distribuées démarrées explicitement avec BEGIN DISTRIBUTED TRANSACTION ou promues à partir d’une transaction locale.
Note
Le moteur de base de données ne prend pas en charge les transactions imbriquées gérables indépendamment. Une validation d’une transaction interne décrémente @@TRANCOUNT mais n’a aucun autre effet. Une restauration d’une transaction interne restaure toujours la transaction externe, sauf si un point d’enregistrement existe et est spécifié dans l’instruction ROLLBACK .
Comportement de verrouillage
Une ROLLBACK TRANSACTION instruction spécifiant une savepoint_name libère tous les verrous acquis au-delà du point d’enregistrement, à l’exception des verrous réaffectés et convertis. Ces verrous ne sont pas libérés et ne sont pas convertis en mode de verrouillage précédent.
Permissions
Nécessite l’appartenance au rôle public.
Examples
Les exemples de code de cet article utilisent les bases de données d'exemple AdventureWorks2025 ou AdventureWorksDW2025, que vous pouvez télécharger à partir de la page d'accueil Microsoft SQL Server Samples and Community Projects.
L’exemple suivant montre comment utiliser un point d’enregistrement de transaction pour restaurer uniquement les modifications apportées par une procédure stockée si une transaction est démarrée avant l’exécution de la procédure stockée.
IF EXISTS (SELECT name FROM sys.objects
WHERE name = N'SaveTranExample')
DROP PROCEDURE SaveTranExample;
GO
CREATE PROCEDURE SaveTranExample
@InputCandidateID INT
AS
-- Detect whether the procedure was called
-- from an active transaction and save
-- that for later use.
-- In the procedure, @TranCounter = 0
-- means there was no active transaction
-- and the procedure started one.
-- @TranCounter > 0 means an active
-- transaction was started before the
-- procedure was called.
DECLARE @TranCounter INT;
SET @TranCounter = @@TRANCOUNT;
IF @TranCounter > 0
-- Procedure called when there is
-- an active transaction.
-- Create a savepoint to be able
-- to roll back only the work done
-- in the procedure if there is an
-- error.
SAVE TRANSACTION ProcedureSave;
ELSE
-- Procedure must start its own
-- transaction.
BEGIN TRANSACTION;
-- Modify database.
BEGIN TRY
DELETE HumanResources.JobCandidate
WHERE JobCandidateID = @InputCandidateID;
-- Get here if no errors; must commit
-- any transaction started in the
-- procedure, but not commit a transaction
-- started before the transaction was called.
IF @TranCounter = 0
-- @TranCounter = 0 means no transaction was
-- started before the procedure was called.
-- The procedure must commit the transaction
-- it started.
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
-- An error occurred; must determine
-- which type of rollback will roll
-- back only the work done in the
-- procedure.
IF @TranCounter = 0
-- Transaction started in procedure.
-- Roll back complete transaction.
ROLLBACK TRANSACTION;
ELSE
-- Transaction started before procedure
-- called, do not roll back modifications
-- made before the procedure was called.
IF XACT_STATE() <> -1
-- If the transaction is still valid, just
-- roll back to the savepoint set at the
-- start of the stored procedure.
ROLLBACK TRANSACTION ProcedureSave;
-- If the transaction is uncommitable, a
-- rollback to the savepoint is not allowed
-- because the savepoint rollback writes to
-- the log. Just return to the caller, which
-- should roll back the outer transaction.
-- After the appropriate rollback, return error
-- information to the caller.
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT @ErrorMessage = ERROR_MESSAGE();
SELECT @ErrorSeverity = ERROR_SEVERITY();
SELECT @ErrorState = ERROR_STATE();
RAISERROR (
@ErrorMessage, -- Message text.
@ErrorSeverity, -- Severity.
@ErrorState -- State.
);
END CATCH
GO
Contenu connexe
- DÉBUT DE LA TRANSACTION (Transact-SQL)
- TRANSACTION COMMIT (Transact-SQL)
- COMMIT DU TRAVAIL (Transact-SQL)
- ERROR_LINE (Transact-SQL)
- ERROR_MESSAGE (Transact-SQL)
- ERROR_NUMBER (Transact-SQL)
- ERROR_PROCEDURE (Transact-SQL)
- ERROR_SEVERITY (Transact-SQL)
- ERROR_STATE (Transact-SQL)
- RAISERROR (Transact-SQL)
- ANNULATION DE LA TRANSACTION (Transact-SQL)
- TRAVAIL DE RETOUR EN ARRIÈRE (Transact-SQL)
- ESSAYER... CATCH (Transact-SQL)
- XACT_STATE (Transact-SQL)
- Guide du verrouillage des transactions et du contrôle de version de ligne