Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Aplica-se a:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Base de dados SQL no Microsoft Fabric
Define um ponto de salvamento dentro de uma transação.
Transact-SQL convenções de sintaxe
Syntax
SAVE { TRAN | TRANSACTION } { savepoint_name | @savepoint_variable }
[ ; ]
Arguments
savepoint_name
É o nome atribuído ao savepoint. Os nomes de pontos de salvamento devem estar em conformidade com as regras para identificadores, mas estão limitados a 32 caracteres. savepoint_name é sempre sensível a maiúsculas e minúsculas, mesmo quando a instância do Motor de Base de Dados não é sensível a maiúsculas e minúsculas.
@savepoint_variable
É o nome de uma variável definida pelo usuário que contém um nome de savepoint válido. A variável deve ser declarada com um tipo de dados char, varchar, nchar ou nvarchar . Mais de 32 caracteres podem ser passados à variável, mas apenas os primeiros 32 caracteres são usados.
Remarks
Pode definir um ponto de gravação dentro de uma transação. O ponto de gravação define um estado de consistência ao qual uma transação pode regressar se uma parte da transação for cancelada condicionalmente. Se uma transação for revertida para um ponto de gravação, deve avançar até à conclusão com mais extratos de Transact-SQL, se necessário, e um COMMIT TRANSACTION extrato, ou deve ser cancelada completamente revertendo a transação ao início. Para cancelar toda uma transação, use o formulário ROLLBACK TRANSACTION transaction_name. Todas as declarações ou procedimentos da transação são desfeitos.
Nomes duplicados de pontos de gravação são permitidos numa transação, mas uma ROLLBACK TRANSACTION instrução que especifique o nome do ponto de gravação só reverte a transação para a mais recente SAVE TRANSACTION que usa esse nome.
SAVE TRANSACTION Não é suportado em transações distribuídas iniciadas explicitamente com BEGIN DISTRIBUTED TRANSACTION ou promovidas a partir de uma transação local.
Observação
O Motor de Base de Dados não suporta transações aninhadas geríveis de forma independente. Um commit de uma transação interna diminui @@TRANCOUNT mas não tem outros efeitos. Um rollback de uma transação interna reverte sempre a transação externa, a menos que exista um ponto de gravação especificado na ROLLBACK instrução.
Comportamento de bloqueio
Uma ROLLBACK TRANSACTION declaração que especifica um savepoint_name liberta quaisquer bloqueios adquiridos para além do ponto de gravação, exceto os bloqueios escalados e convertidos. Esses bloqueios não são liberados e não são convertidos de volta para o modo de bloqueio anterior.
Permissions
Requer associação à public função.
Examples
Os exemplos de código neste artigo usam o banco de dados de exemplo AdventureWorks2025 ou AdventureWorksDW2025, que pode ser descarregado da página inicial de Exemplos e Projetos da Comunidade do Microsoft SQL Server.
O exemplo seguinte mostra como usar um ponto de gravação de transação para reverter apenas as modificações feitas por um procedimento armazenado se uma transação for iniciada antes de o procedimento armazenado ser executado.
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
Conteúdo relacionado
- INICIAR TRANSAÇÃO (Transact-SQL)
- TRANSAÇÃO COMMIT (Transact-SQL)
- TRABALHO DE COMPROMISSO (Transact-SQL)
- LINHA_ERRO (Transact-SQL)
- MENSAGEM_DE_ERRO (Transact-SQL)
- ERROR_NUMBER (Transact-SQL)
- PROCEDIMENTO_ERRO (Transact-SQL)
- ERROR_SEVERITY (Transact-SQL)
- ERROR_STATE (Transact-SQL)
- RAISERROR (Transact-SQL)
- TRANSAÇÃO DE REVERSÃO (Transact-SQL)
- TRABALHO DE REVERSÃO (Transact-SQL)
- TENTE... CAPTURAR (Transact-SQL)
- XACT_STATE (Transact-SQL)
- Guia de bloqueio de transações e controle de versão de linhas