Compartilhar via


BEGIN TRANSACTION (Transact-SQL)

Marca o ponto inicial de uma transação local explícita. BEGIN TRANSACTION incrementa @@TRANCOUNT em 1.

Aplica-se a: SQL Server (SQL Server 2008 até a versão atual), Banco de dados SQL do Azure (versão inicial até a versão atual).

Ícone de vínculo de tópico Convenções da sintaxe Transact-SQL

Sintaxe

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

Argumentos

  • transaction_name
    É o nome atribuído à transação. transaction_name deve obedecer às as regras de identificadores, mas identificadores maiores que 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 é com diferenciação de maiúsculas e minúsculas, mesmo quando a instância do SQL Server não diferencia maiúsculas de minúsculas.

  • @tran\_name\_variable
    É o nome de uma variável definida pelo usuário que contém um nome de transação válido. A variável deve ser declarada com um 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' ]
    Especifica que a transação é marcada no log. description é uma cadeia de caracteres que descreve a marca. Um description mais longo que 128 caracteres é truncado para 128 caracteres antes de ser armazenado 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

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 irá falhar se o provedor OLE DB utilizado para acessar o servidor vinculado não aceitar 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, consulte 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, consulte 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, consulte Usar transações marcadas para recuperar bancos de dados relacionados consistentemente (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.

new_name BEGIN TRAN e WITH MARK podem ser aninhados em uma transação existente que não seja marcada. Ao fazer isso, new_name se torna o nome da marca da transação, apesar de o nome da transação já poder ter sido determinado. 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.Nomeando uma transação

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

DECLARE @TranName VARCHAR(20);
SELECT @TranName = 'MyTransaction';

BEGIN TRANSACTION @TranName;
USE AdventureWorks2012;
DELETE FROM AdventureWorks2012.HumanResources.JobCandidate
    WHERE JobCandidateID = 13;

COMMIT TRANSACTION @TranName;
GO

B.Marcando uma transação

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 AdventureWorks2012;
GO
DELETE FROM AdventureWorks2012.HumanResources.JobCandidate
    WHERE JobCandidateID = 13;
GO
COMMIT TRANSACTION CandidateDelete;
GO

Consulte também

Referência

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)