Partilhar via


INICIAR TRANSAÇÃO (Transact-SQL)

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSistema de Plataforma de Análise (PDW)Armazém no Microsoft FabricBase de dados SQL no Microsoft Fabric

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

Transact-SQL convenções de sintaxe

Syntax

Syntax for SQL Server, Azure SQL Database, Azure SQL Managed Instance, SQL database no Microsoft Fabric.

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

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

BEGIN { TRAN | TRANSACTION }
[ ; ]

Arguments

transaction_name

Aplica-se a: SQL Server 2008 (10.0.x) e versões posteriores, Azure SQL Database, Azure SQL Managed Instance, base de dados SQL no Microsoft Fabric.

O nome atribuído à transação. transaction_name deve estar em conformidade com as regras para identificadores, mas identificadores com mais de 32 caracteres não são permitidos. Use os nomes das transações apenas no par mais externo de BEGIN...COMMIT instruções OR BEGIN...ROLLBACK . transaction_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.

@tran_name_variable

Aplica-se a: SQL Server 2008 (10.0.x) e versões posteriores, Azure SQL Database, Azure SQL Managed Instance, base 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 deve ser declarada com um tipo de dados char, varchar, nchar ou nvarchar . Se mais de 32 caracteres forem passados para a variável, apenas os primeiros 32 caracteres serão usados. Os caracteres restantes são truncados.

COM MARCA [ 'descrição' ]

Aplica-se a: SQL Server 2008 (10.0.x) e versões posteriores, Azure SQL Database, Azure SQL Managed Instance, base de dados SQL no Microsoft Fabric.

Especifica que a transação está marcada no registo 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 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 registo de transações num 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 podem BEGIN TRANSACTION ser revertidas para devolver os dados a este estado conhecido de consistência. Cada transação dura até COMMIT TRANSACTION ser emitida para tornar as modificações uma parte permanente da base de dados, ou até que todas as modificações sejam apagadas com uma ROLLBACK TRANSACTION instrução.

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

BEGIN TRANSACTION inicia uma transação local para a sessão que emite o extrato. Dependendo das definições atuais do nível de isolamento da transação, os recursos adquiridos para suportar as instruções Transact-SQL emitidas pela sessão ficam bloqueados pela transação até que esta seja concluída com uma COMMIT TRANSACTION instrução ou.ROLLBACK TRANSACTION Transações pendentes por longos períodos podem impedir que outras sessões acedam a estes recursos bloqueados, e também podem impedir o truncamento dos registos de transações e a limpeza da loja 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 executar uma INSERTinstrução , UPDATEou DELETE . Uma vez iniciada uma transação, o Motor de Base de Dados pode realizar ações como adquirir bloqueios para proteger o nível de isolamento das transações das SELECT instruções, mas nada é registado no registo de transações até que a aplicação execute uma ação de modificação.

Após a emissão BEGIN TRANSACTION, pode emitir BEGIN TRANSACTION novamente para iniciar uma ou mais transações internas. Embora possas especificar transaction_name para uma transação interna, apenas o nome da primeira transação (mais externa) está registado no sistema. Um rollback para qualquer outro nome (que não seja um nome válido de ponto de gravação) gera um erro sem reverter nenhuma das sentenças. As instruções são revertidas somente quando a transação externa é revertida.

A transação local iniciada pela BEGIN TRANSACTION instrução é promovida a transação distribuída se as seguintes ações forem realizadas antes de a instrução ser confirmada ou revertida:

  • Uma INSERTinstrução , DELETEou 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 oferecer suporte à ITransactionJoin interface.

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

A instância local do Motor de Base de Dados torna-se o controlador de transações e utiliza o Microsoft Distributed Transaction Coordinator (MS DTC) para gerir a transação distribuída.

Uma transação pode ser explicitamente executada como uma transação distribuída usando BEGIN DISTRIBUTED TRANSACTION. Para obter mais informações, consulte BEGIN DISTRIBUTED TRANSACTION.

Quando SET IMPLICIT_TRANSACTIONS é definido para ON, uma BEGIN TRANSACTION instrução cria uma transação externa e uma interna, definindo @@TRANCOUNT para 2. Para obter mais informações, consulte SET IMPLICIT_TRANSACTIONS.

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.

Transações marcadas

A WITH MARK opção faz com que o nome da transação seja registado no registo de transações. Quando restaura uma base de dados para um estado anterior, a transação marcada pode ser usada para especificar o ponto de restauro em vez de uma data e hora. Para obter mais informações, consulte Usar transações marcadas para recuperar bancos de dados relacionados consistentemente e Instruções RESTORE.

Além disso, as marcas de registo de transação são necessárias se precisar de recuperar um conjunto de bases de dados relacionadas para um certo estado partilhado de consistência. Uma aplicação que esteja ciente do estado de consistência de cada base de dados pode colocar marcas nos registos de transações das bases de dados relacionadas usando uma transação cross-database ou distribuída. Recuperar o conjunto de bases de dados relacionadas a estas marcas resulta num conjunto de bases de dados que têm um estado partilhado de consistência conhecido.

A marca é colocada 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 registadas no registo.

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 exterior não estiver marcada. No exemplo conceptual seguinte, 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;

Quando marca uma transação interna, recebe 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

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.

A. Usar uma transação explícita

Aplica-se a: SQL Server 2008 (10.0.x) e versões posteriores, Azure SQL Database, Azure SQL Managed Instance, SQL database in Microsoft Fabric, Azure Synapse Analytics, Analytics Platform System (PDW)

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, Azure SQL Database, Azure SQL Managed Instance, SQL database in Microsoft Fabric, Azure Synapse Analytics, Analytics Platform System (PDW)

O exemplo a seguir mostra o efeito de reverter 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. Nomeie uma transação

Aplica-se a: SQL Server 2008 (10.0.x) e versões posteriores, Azure SQL Database, Azure SQL Managed Instance, base 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, Azure SQL Database, Azure SQL Managed Instance, base 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;