Compartilhar via


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 o BEGIN TRANSACTION extrato e terminam com o COMMIT extrato ou ROLLBACK .

Convenções de sintaxe de Transact-SQL

Sintaxe

Sintaxe para SQL Server, Banco de Dados SQL do Azure e Instância Gerenciada SQL do Azure.

BEGIN { TRAN | TRANSACTION }
    [ { transaction_name | @tran_name_variable }
      [ WITH MARK [ 'description' ] ]
    ]
[ ; ]

Sintaxe para Synapse Data Warehouse no Microsoft Fabric, Azure Synapse Analytics e Analytics Platform System (PDW).

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 e Instância Gerenciada SQL do Azure

O nome atribuído à transação. transaction_name devem estar em conformidade com as regras para identificadores, mas identificadores com mais de 32 caracteres não são permitidos. Use nomes de transação somente no par mais externo de instruções ou BEGIN...ROLLBACK aninhadasBEGIN...COMMIT. 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 e Instância Gerenciada 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 passados para a variável, somente os primeiros 32 caracteres serão usados. Os caracteres restantes são truncados.

WITH MARK [ 'description' ]

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

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

Se WITH MARK for usado, um nome de transação deve ser especificado. WITH MARK Permite restaurar um log de transações para uma marca nomeada.

Comentários

BEGIN TRANSACTION incrementos @@TRANCOUNT por 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 após o BEGIN TRANSACTION podem ser revertidas para retornar os dados a esse estado conhecido de consistência. Cada transação dura até que seja concluída sem erros e COMMIT TRANSACTION seja emitida para tornar as modificações uma parte permanente do banco de dados, ou erros sejam encontrados e todas as modificações sejam apagadas com uma ROLLBACK TRANSACTION instrução.

BEGIN TRANSACTION Inicia uma transação local para a conexão que emite a instrução. Dependendo das configurações atuais do nível de isolamento da transação, muitos recursos adquiridos para dar suporte às instruções Transact-SQL emitidas pela conexão são bloqueados pela transação até que ela seja concluída com uma COMMIT TRANSACTION instrução 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, ela não é registrada no log de transações até que o aplicativo execute uma ação que deve ser registrada no log, como executar uma INSERTinstrução , UPDATEou DELETE . Um aplicativo pode executar ações como adquirir bloqueios para proteger o nível de isolamento de transação de instruções, mas nada é registrado no log até que o aplicativo execute uma ação de SELECT 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 iniciada pela instrução será escalada para BEGIN TRANSACTION uma transação distribuída se as seguintes ações forem executadas antes que a instrução seja confirmada ou revertida:

  • Uma INSERTinstrução , DELETEou UPDATE que faz referência a uma tabela remota em um servidor vinculado é executada. A INSERTinstrução , UPDATEou DELETE falhará se o provedor OLE DB usado para acessar o servidor vinculado não oferecer suporte à ITransactionJoin interface.

  • Uma chamada é feita para um procedimento armazenado remoto quando a REMOTE_PROC_TRANSACTIONS opção é 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 TRANSACTIONo . Para obter mais informações, consulte BEGIN DISTRIBUTED TRANSACTION.

Quando SET IMPLICIT_TRANSACTIONS é definida como ON, uma BEGIN TRANSACTION instrução cria duas transações aninhadas. Para saber mais, confira SET IMPLICIT_TRANSACTIONS.

Transações marcadas

A WITH MARK opção faz com que o nome da transação seja colocado no log de transações. Quando você restaura um banco de dados para um estado anterior, a transação marcada pode ser usada no lugar de uma data e hora. Para obter mais informações, consulte Usar transações marcadas para recuperar bancos de dados relacionados de forma consistente e instruções RESTORE.

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 são marcadas.

BEGIN TRANSACTION <new_name> WITH MARK pode ser aninhado em uma transação já existente que não está marcada. Ao fazer isso, <new_name> torna-se o nome da marca para a transação, apesar do nome que a transação já poderia ter sido dado. 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;

Quando você aninhar transações, você recebe a seguinte mensagem de aviso se você tentar marcar uma transação que já está marcada:

Server: Msg 3920, Level 16, State 1, Line 3
WITH MARK option only applies to the first BEGIN TRAN WITH MARK.
The option is ignored.

Permissões

Requer associação à função pública .

Exemplos

Os exemplos de código do Transact-SQL deste artigo usa o banco de dados de exemplo AdventureWorks2022, que pode ser baixado da home page Microsoft SQL Server Samples and Community Projects.

R. Usar uma transação explícita

Aplica-se a: SQL Server 2008 (10.0.x) e versões posteriores, Banco de Dados SQL do Azure, Instância Gerenciada SQL do Azure, Azure Synapse Analytics, Analytics Platform System (PDW)

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, Instância Gerenciada SQL do Azure, Azure Synapse Analytics, Analytics Platform System (PDW)

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

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

C. Nomear uma transação

Aplica-se a: SQL Server 2008 (10.0.x) e versões posteriores, Banco de Dados SQL do Azure, Instância Gerenciada 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. Marcar uma transação

Aplica-se a: SQL Server 2008 (10.0.x) e versões posteriores, Banco de Dados SQL do Azure, Instância Gerenciada 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