Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Se aplica a:SQL Server
Azure SQL Database
Instancia
administrada de Azure SQLBase de datos SQL en Microsoft Fabric
Establece un punto de retorno dentro de una transacción.
Convenciones de sintaxis de Transact-SQL
Syntax
SAVE { TRAN | TRANSACTION } { savepoint_name | @savepoint_variable }
[ ; ]
Arguments
savepoint_name
Es el nombre asignado al punto de retorno. Los nombres de los puntos de retorno deben ajustarse a las reglas para los identificadores, aunque están limitados a 32 caracteres. savepoint_name siempre distingue mayúsculas de minúsculas, incluso cuando la instancia del motor de base de datos no distingue mayúsculas de minúsculas.
@savepoint_variable
Es el nombre de una variable definida por el usuario que contiene un nombre de punto de retorno válido. La variable debe declararse con un tipo de datos char, varchar, nchar o nvarchar. Se pueden pasar más de 32 caracteres a la variable, pero solo se usan los primeros 32 caracteres.
Remarks
Puede establecer un punto de guardado dentro de una transacción. El punto de retorno define un estado de coherencia al que una transacción puede devolver si se cancela condicionalmente una parte de la transacción. Si una transacción se revierte a un punto de retorno, debe continuar con la finalización con más instrucciones Transact-SQL si es necesario y una COMMIT TRANSACTION instrucción, o bien se debe cancelar por completo al revertir la transacción a su principio. Para cancelar una transacción completa, use el formulario ROLLBACK TRANSACTION transaction_name. Se deshacen todas las instrucciones o procedimientos de la transacción.
Los nombres de puntos de guardado duplicados se permiten en una transacción, pero una ROLLBACK TRANSACTION instrucción que especifica el nombre del punto de retorno solo revierte la transacción a la más reciente SAVE TRANSACTION con ese nombre.
SAVE TRANSACTION no se admite en las transacciones distribuidas iniciadas explícitamente con BEGIN DISTRIBUTED TRANSACTION o promocionadas desde una transacción local.
Nota:
El motor de base de datos no admite transacciones anidadas administrables de forma independiente. Confirmación de una disminución de @@TRANCOUNT transacción interna, pero no tiene otros efectos. Una reversión de una transacción interna siempre revierte la transacción externa, a menos que exista un punto de guardado y se especifique en la ROLLBACK instrucción .
Comportamiento de bloqueo
Una ROLLBACK TRANSACTION instrucción que especifica un savepoint_name libera los bloqueos adquiridos más allá del punto de guardado, excepto los bloqueos escalados y convertidos. Estos bloqueos no se liberan y no se convierten de nuevo al modo de bloqueo anterior.
Permissions
Requiere la pertenencia al rol public.
Examples
Los ejemplos de código de este artículo usan la base de datos de ejemplo de AdventureWorks2025 o AdventureWorksDW2025, que puede descargar de la página principal de Ejemplos de Microsoft SQL Server y proyectos de comunidad.
En el ejemplo siguiente se muestra cómo usar un punto de guardado de transacción para revertir solo las modificaciones realizadas por un procedimiento almacenado si se inicia una transacción antes de que se ejecute el procedimiento almacenado.
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
Contenido relacionado
- INICIAR LA TRANSACCIÓN (Transact-SQL)
- CONFIRMAR TRANSACCIÓN (Transact-SQL)
- COMPROMETER EL TRABAJO (Transact-SQL)
- ERROR_LINE (Transact-SQL)
- ERROR_MESSAGE (Transact-SQL)
- ERROR_NUMBER (Transact-SQL)
- ERROR_PROCEDURE (Transact-SQL)
- SEVERIDAD_DEL_ERROR (Transact-SQL)
- ERROR_STATE (Transact-SQL)
- RAISERROR (Transact-SQL)
- TRANSACCIÓN DE REVERSIÓN (Transact-SQL)
- TRABAJO DE RETROCESO (Transact-SQL)
- PROBAR... CATCH (Transact-SQL)
- XACT_STATE (Transact-SQL)
- Guía de versiones de bloqueo de fila y transacción