Compartilhar via


INICIAR TRANSAÇÃO (Transact-SQL)

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

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

Convenções de sintaxe de Transact-SQL

Syntax

Sintaxe para SQL Server, Banco de Dados SQL do Azure, Instância Gerenciada de SQL do Azure, Banco de Dados SQL no Microsoft Fabric.

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

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

BEGIN { TRAN | TRANSACTION }
[ ; ]

Arguments

transaction_name

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

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 externo ou BEGIN...COMMITBEGIN...ROLLBACK instruções. transaction_name sempre diferencia maiúsculas de minúsculas, mesmo quando a instância do Mecanismo de Banco de Dados 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, Instância Gerenciada de SQL do Azure, Banco de Dados SQL no Microsoft Fabric.

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.

COM MARK [ 'descrição' ]

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

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

Se WITH MARK for usado, um nome de transação deverá ser especificado. WITH MARK permite restaurar um log de transações para um ponto identificado pela marca.

Remarks

BEGIN TRANSACTION incrementos @@TRANCOUNT em 1.

BEGIN TRANSACTION representa um ponto em que os dados referenciados por uma sessão têm um certo estado de consistência. Todas as modificações de dados feitas após a BEGIN TRANSACTION reversão podem ser revertidas para retornar os dados a esse estado conhecido de consistência. Cada transação dura até COMMIT TRANSACTION ser emitida para tornar as modificações uma parte permanente do banco de dados ou todas as modificações são apagadas com uma ROLLBACK TRANSACTION instrução.

Uma transação pode ser revertida automaticamente se ocorrer um erro de anulação de transações ou se ocorrer algum erro em tempo de execução e a opção de XACT_ABORT sessão estiver definida como ON. Para obter mais informações, consulte SET XACT_ABORT.

BEGIN TRANSACTION inicia uma transação local para a sessão que emite a instrução. Dependendo das configurações atuais do nível de isolamento da transação, os recursos adquiridos para dar suporte às instruções Transact-SQL emitidas pela sessão são bloqueados pela transação até que ela seja concluída com uma instrução ou ROLLBACK TRANSACTION instruçãoCOMMIT TRANSACTION. As transações deixadas pendentes por longos períodos de tempo podem impedir que outras sessões acessem esses recursos bloqueados e também podem impedir a truncamento do log de transações e a limpeza do repositório de versões.

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 a execução de uma INSERTinstrução , UPDATE, or DELETE . Depois que uma transação é iniciada, o Mecanismo de Banco de Dados pode executar ações como adquirir bloqueios para proteger o nível de isolamento de transações de SELECT instruções, mas nada é registrado no log de transações até que o aplicativo execute uma ação de modificação.

Após a emissão BEGIN TRANSACTION, você pode emitir BEGIN TRANSACTION novamente para iniciar uma ou mais transações internas. Embora você possa especificar transaction_name para uma transação interna, somente o primeiro nome de 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 sem reverter nenhuma das instruções. As instruções são revertidas somente quando a transação externa é revertida.

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

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

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

A instância local do Mecanismo de Banco de Dados torna-se o controlador de 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.

Quando SET IMPLICIT_TRANSACTIONS é definido como ON, uma BEGIN TRANSACTION instrução cria uma transação externa e interna, configurando @@TRANCOUNT como 2. Para saber mais, confira SET IMPLICIT_TRANSACTIONS.

Observação

O Mecanismo de Banco de Dados não dá suporte a transações aninhadas gerenciáveis de forma independente. Uma confirmação de uma transação interna diminui @@TRANCOUNT , mas não tem outros efeitos. Uma reversão de uma transação interna sempre reverte a transação externa, a menos que um ponto de salvamento exista e seja especificado na instrução ROLLBACK .

Transações marcadas

A WITH MARK opção faz com que o nome da transação seja registrado no log de transações. Quando você restaura um banco de dados para um estado anterior, a transação marcada pode ser usada para especificar o ponto de restauração em vez 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 são necessárias se você precisar recuperar um conjunto de bancos de dados relacionados para um determinado estado compartilhado de consistência. Um aplicativo que esteja ciente do estado de consistência de cada banco de dados pode colocar marcas nos logs de transações dos bancos de dados relacionados usando um banco de dados cruzado ou uma transação distribuída. A recuperação do conjunto de bancos de dados relacionados a essas marcas resulta em um conjunto de bancos de dados que têm um estado de consistência compartilhado conhecido.

A marca é inserida no log de transações somente se o banco de dados for atualizado pela transação marcada. Transações que não modificam dados não são registradas no log.

BEGIN TRANSACTION <new_name> WITH MARK pode ser usado ao iniciar uma transação interna. Nesse caso, <new_name> torna-se o nome da marca da transação se a transação externa não estiver marcada. No exemplo conceitual a seguir, M2 é o nome da marca.

BEGIN TRAN T1;

UPDATE table1 ...;

BEGIN TRAN M2 WITH MARK;

UPDATE table2 ...;

SELECT column1 FROM table1;

COMMIT TRAN M2;

UPDATE table3 ...;

COMMIT TRAN T1;

Ao marcar uma transação interna, você receberá a seguinte mensagem de aviso se 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.

Permissions

Exige a associação à função public.

Examples

Os exemplos de código neste artigo usam o banco de dados de exemplo AdventureWorks2025 ou AdventureWorksDW2025, que você pode baixar na página inicial Microsoft SQL Server Samples and Community Projects.

A. 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 de SQL do Azure, Banco de Dados SQL no Microsoft Fabric, Azure Synapse Analytics, PDW (Analytics Platform System)

BEGIN TRANSACTION;

DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;

COMMIT TRANSACTION;

B. Reverter 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 de SQL do Azure, Banco de Dados SQL no Microsoft Fabric, Azure Synapse Analytics, PDW (Analytics Platform System)

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 de SQL do Azure, Banco de Dados SQL no Microsoft Fabric

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

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

BEGIN TRANSACTION @TranName;

DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;

COMMIT TRANSACTION @TranName;

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 de SQL do Azure, Banco de Dados SQL no Microsoft Fabric

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';

DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;

COMMIT TRANSACTION CandidateDelete;