BEGIN TRANSACTION (Transact-SQL)

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureAzure Synapse AnalyticsPDW (Analytics Platform System)Warehouse in Microsoft Fabric

Marca o ponto inicial de uma transação local explícita. As transações explícitas começam com a instrução BEGIN TRANSACTION e terminam com a instrução COMMIT ou ROLLBACK.

Convenções de sintaxe de Transact-SQL

Sintaxe

--Applies to SQL Server and Azure SQL Database
 
BEGIN { TRAN | TRANSACTION }   
    [ { transaction_name | @tran_name_variable }  
      [ WITH MARK [ 'description' ] ]  
    ]  
[ ; ]  
--Applies to Synapse Data Warehouse in Microsoft Fabric, Azure Synapse Analytics and Parallel Data Warehouse
 
BEGIN { TRAN | TRANSACTION }   
[ ; ]  

Observação

Para exibir a sintaxe do Transact-SQL para o SQL Server 2014 (12.x) e versões anteriores, confira a Documentação das versões anteriores.

Argumentos

transaction_name
Aplica-se a: SQL Server 2008 (10.0.x) e versões posteriores, Banco de Dados SQL do Azure

É o nome atribuído à transação. O transaction_name precisa estar em conformidade com as regras para identificadores, mas identificadores com mais de 32 caracteres não são permitidos. Somente use nomes de transação no par externo de instruções aninhadas BEGIN ...COMMIT ou BEGIN...ROLLBACK. transaction_name sempre diferencia maiúsculas de minúsculas, mesmo quando a instância do SQL Server não diferencia maiúsculas de minúsculas.

@tran_name_variable
Aplica-se a: SQL Server 2008 (10.0.x) e versões posteriores, Banco de Dados SQL do Azure

É o nome de uma variável definida pelo usuário que contém um nome de transação válido. A variável precisa ser declarada com o tipo de dados char, varchar, nchar ou nvarchar. Se mais de 32 caracteres forem transmitidos à variável, apenas os primeiros 32 caracteres serão usados, os demais serão truncados.

WITH MARK [ 'description' ]
Aplica-se a: SQL Server 2008 (10.0.x) e versões posteriores, Banco de Dados SQL do Azure

Especifica que a transação é marcada no log. description é uma cadeia de caracteres que descreve a marca. Uma description com mais de 128 caracteres será truncada em 128 caracteres antes de ser armazenada na tabela msdb.dbo.logmarkhistory.

Se WITH MARK for usado, o nome da transação deverá ser especificado. WITH MARK permite restaurar um log de transações para uma indicação nomeada.

Comentários gerais

BEGIN TRANSACTION incrementa @@TRANCOUNT em 1.

BEGIN TRANSACTION representa um ponto no qual os dados referenciados por uma conexão são lógica e fisicamente consistentes. Se forem encontrados erros, todas as modificações de dados feitas depois do BEGIN TRANSACTION poderão ser revertidas para voltar os dados ao estado conhecido de consistência. Cada transação dura até ser completada sem erros e COMMIT TRANSACTION é emitido para tornar as modificações parte permanente do banco de dados, ou são encontrados erros e todas as modificações são removidas com uma instrução ROLLBACK TRANSACTION.

BEGIN TRANSACTION inicia uma transação local para a conexão que emite a instrução. Dependendo das configurações de nível de isolamento da transação atual, muitos recursos adquiridos para aceitar as instruções Transact-SQL emitidas pela conexão são fechados pela transação, até que seja completada com uma instrução COMMIT TRANSACTION ou ROLLBACK TRANSACTION. Transações pendentes por longos períodos de tempo podem impedir outros usuários de acessar estes recursos bloqueados e também podem prevenir a operação de truncar o log.

Embora BEGIN TRANSACTION inicie uma transação local, não é registrado no log de transações até que o aplicativo execute subsequentemente uma ação que deve ser registrada no log, como executar uma instrução INSERT, UPDATE ou DELETE. Um aplicativo pode executar ações como adquirir bloqueios para proteger o nível de isolamento da transação de instruções SELECT, mas nada é registrado no log até que o aplicativo execute uma ação de modificação.

Nomear múltiplas transações em uma série de transações aninhadas com um nome de transação tem pouco efeito na transação. Somente o primeiro nome da transação (externo) é registrado no sistema. Uma reversão para qualquer outro nome (diferente de um nome de ponto de salvamento válido) gera um erro. Nenhuma das instruções executadas antes da reversão são, na realidade, revertidas quando ocorre o erro. As instruções são revertidas somente quando a transação externa é revertida.

A transação local que foi iniciada pela instrução BEGIN TRANSACTION será escalada para uma transação distribuída, se as seguintes ações forem executadas antes de a instrução ser confirmada ou revertida:

  • Uma instrução de INSERT, DELETE ou UPDATE que faz referência a uma tabela remota em um servidor vinculado é executada. A instrução INSERT, UPDATE ou DELETE falhará se o provedor OLE DB usado para acessar o servidor vinculado não for compatível com a interface ITransactionJoin.

  • Uma chamada é feita para um procedimento armazenado remoto quando a opção REMOTE_PROC_TRANSACTIONS é definida como ON.

A cópia local do SQL Server se torna o controlador da transação e usa o MS DTC (Coordenador de Transações Distribuídas da Microsoft) para gerenciar a transação distribuída.

Uma transação pode ser executada explicitamente como uma transação distribuída usando BEGIN DISTRIBUTED TRANSACTION. Para obter mais informações, confira BEGIN DISTRIBUTED TRANSACTION (Transact-SQL).

Quando SET IMPLICIT_TRANSACTIONS está definida como ON, a instrução BEGIN TRANSACTION cria duas transações aninhadas. Para obter mais informações, confira SET IMPLICIT_TRANSACTIONS (Transact-SQL)

Transações marcadas

A opção WITH MARK faz com que o nome da transação ser inserido no log de transações. Ao restaurar um banco de dados a um estado anterior, a transação marcada pode ser usada em lugar de uma data e hora. Para obter mais informações, confira Usar transações marcadas para recuperar bancos de dados relacionados de forma consistente (Modelo de recuperação completa) e RESTORE (Transact-SQL).

Além disso, as marcas de log de transações serão necessárias se você precisar recuperar um conjunto de bancos de dados relacionados a um estado logicamente consistente. Prefixos podem ser colocados nos logs de transação dos bancos de dados relacionados por meio de uma transação distribuída. Recuperar o conjunto de bancos de dados relacionados a estes prefixos resulta em um conjunto de bancos de dados que são transacionalmente consistentes. A inserção de marcas em bancos de dados relacionados requer procedimentos especiais.

A marca é inserida no log de transações somente se o banco de dados for atualizado pela transação marcada. As transações que não modificam dados não têm prefixos.

BEGIN TRAN new_name WITH MARK pode ser aninhado dentro de uma transação já existente que não esteja marcada. Ao fazer isso, new_name torna-se o nome da marca da transação, apesar do nome que a transação já possa ter recebido. No exemplo a seguir, M2 é o nome do prefixo.

BEGIN TRAN T1;  
UPDATE table1 ...;  
BEGIN TRAN M2 WITH MARK;  
UPDATE table2 ...;  
SELECT * from table1;  
COMMIT TRAN M2;  
UPDATE table3 ...;  
COMMIT TRAN T1;  

Ao aninhar transações, tentando marcar uma transação que já possui resultados marcados em uma mensagem de aviso (não um erro):

"BEGIN TRAN T1 WITH MARK ...;"

"UPDATE table1 ...;"

"BEGIN TRAN M2 WITH MARK ...;"

"Server: Msg 3920, Level 16, State 1, Line 3"

“A opção WITH MARK é aplicável somente ao primeiro BEGIN TRAN WITH MARK."

"A opção é ignorada."

Permissões

Requer associação à função public.

Exemplos

a. Usando uma transação explícita

Aplica-se a: SQL Server 2008 (10.0.x) e versões posteriores, Banco de Dados SQL do Azure, Azure Synapse Analytics, Parallel Data Warehouse

Este exemplo usa o AdventureWorks.

BEGIN TRANSACTION;  
DELETE FROM HumanResources.JobCandidate  
    WHERE JobCandidateID = 13;  
COMMIT;  

B. Revertendo uma transação

Aplica-se a: SQL Server 2008 (10.0.x) e versões posteriores, Banco de Dados SQL do Azure, Azure Synapse Analytics, Parallel Data Warehouse

O exemplo a seguir mostra o efeito da reversão de uma transação. Neste exemplo, a instrução ROLLBACK reverterá a instrução INSERT, mas a tabela criada ainda continuará a existir.

CREATE TABLE ValueTable (id INT);  
BEGIN TRANSACTION;  
       INSERT INTO ValueTable VALUES(1);  
       INSERT INTO ValueTable VALUES(2);  
ROLLBACK;  

C. Nomeando uma transação

Aplica-se a: SQL Server 2008 (10.0.x) e versões posteriores, Banco de Dados SQL do Azure

O exemplo a seguir mostra como nomear uma transação.

DECLARE @TranName VARCHAR(20);  
SELECT @TranName = 'MyTransaction';  
  
BEGIN TRANSACTION @TranName;  
USE AdventureWorks2022;  
DELETE FROM AdventureWorks2022.HumanResources.JobCandidate  
    WHERE JobCandidateID = 13;  
  
COMMIT TRANSACTION @TranName;  
GO  

D. Marcando uma transação

Aplica-se a: SQL Server 2008 (10.0.x) e versões posteriores, Banco de Dados SQL do Azure

O exemplo a seguir mostra como marcar uma transação. A transação CandidateDelete é marcada.

BEGIN TRANSACTION CandidateDelete  
    WITH MARK N'Deleting a Job Candidate';  
GO  
USE AdventureWorks2022;  
GO  
DELETE FROM AdventureWorks2022.HumanResources.JobCandidate  
    WHERE JobCandidateID = 13;  
GO  
COMMIT TRANSACTION CandidateDelete;  
GO  

Consulte Também

BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)
COMMIT TRANSACTION (Transact-SQL)
COMMIT WORK (Transact-SQL)
ROLLBACK TRANSACTION (Transact-SQL)
ROLLBACK WORK (Transact-SQL)
SAVE TRANSACTION (Transact-SQL)