BEGIN TRANSACTION (Transact-SQL)
Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics Warehouse do PDW (Analytics Platform System) 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
Sintaxe
Sintaxe para SQL Server, Banco de Dados SQL do Azure e Instância Gerenciada de 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 PDW (Analytics Platform System).
BEGIN { TRAN | TRANSACTION }
[ ; ]
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 de 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 de 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 de 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 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 uma marca nomeada.
Comentários
BEGIN TRANSACTION
incrementos @@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 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
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 a execução de uma INSERT
instrução , UPDATE
, or DELETE
. Um aplicativo pode executar ações como adquirir bloqueios para proteger o nível de isolamento da 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 BEGIN TRANSACTION
pela instrução será escalonada para uma transação distribuída se as seguintes ações forem executadas antes que a instrução seja confirmada ou revertida:
Uma
INSERT
instrução ,DELETE
, ouUPDATE
que faz referência a uma tabela remota em um servidor vinculado é executada. AINSERT
instrução ,UPDATE
, orDELETE
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 comoON
.
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.
When SET IMPLICIT_TRANSACTIONS
é definido 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 os 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á pode 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;
Ao aninhar transações, 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.
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
ou AdventureWorksDW2022
, 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 de SQL do Azure, Azure Synapse Analytics, PDW (Analytics Platform System)
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 de SQL do Azure, 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
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 de 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