BEGIN TRANSACTION (Transact-SQL)BEGIN TRANSACTION (Transact-SQL)

ESTE TÓPICO APLICA-SE A:simSQL Server (a partir de 2008)simAzure SQL DatabasesimAzure SQL Data Warehouse simParallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

Marca o ponto inicial de uma transação local explícita.Marks the starting point of an explicit, local transaction. Transações explícitas começam com a instrução BEGIN TRANSACTION e terminam com a instrução COMMIT ou ROLLBACK.Explicit transactions start with the BEGIN TRANSACTION statement and end with the COMMIT or ROLLBACK statement.

Ícone de link do tópico Convenções da sintaxe Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxeSyntax

--Applies to SQL Server and Azure SQL Database

BEGIN { TRAN | TRANSACTION }   
    [ { transaction_name | @tran_name_variable }  
      [ WITH MARK [ 'description' ] ]  
    ]  
[ ; ]  
--Applies to Azure SQL Data Warehouse and Parallel Data Warehouse

BEGIN { TRAN | TRANSACTION }   
[ ; ]  

ArgumentosArguments

transaction_nametransaction_name
Aplica-se a: SQL Server (começando com o 2008), o banco de dados do SQL AzureAPPLIES TO: SQL Server (starting with 2008), Azure SQL Database

É o nome atribuído à transação.Is the name assigned to the transaction. transaction_name devem estar em conformidade com as regras para identificadores, mas identificadores maiores que 32 caracteres não são permitidos.transaction_name must conform to the rules for identifiers, but identifiers longer than 32 characters are not allowed. Somente use nomes de transação no par externo de instruções aninhadas BEGIN ...COMMIT ou BEGIN...ROLLBACK.Use transaction names only on the outermost pair of nested BEGIN...COMMIT or BEGIN...ROLLBACK statements. transaction_name é sempre maiusculas e minúsculas, mesmo quando a instância do SQL ServerSQL Server não diferencia maiusculas de minúsculas.transaction_name is always case sensitive, even when the instance of SQL ServerSQL Server is not case sensitive.

@tran_name_variable@tran_name_variable
Aplica-se a: SQL Server (começando com o 2008), o banco de dados do SQL AzureAPPLIES TO: SQL Server (starting with 2008), Azure SQL Database

É o nome de uma variável definida pelo usuário que contém um nome de transação válido.Is the name of a user-defined variable containing a valid transaction name. A variável deve ser declarada com uma char, varchar, nchar, ou nvarchar tipo de dados.The variable must be declared with a char, varchar, nchar, or nvarchar data type. Se mais de 32 caracteres forem transmitidos à variável, apenas os primeiros 32 caracteres serão usados, os demais serão truncados.If more than 32 characters are passed to the variable, only the first 32 characters will be used; the remaining characters will be truncated.

WITH MARK ['descrição']WITH MARK [ 'description' ]
Aplica-se a: SQL Server (começando com o 2008), o banco de dados do SQL AzureAPPLIES TO: SQL Server (starting with 2008), Azure SQL Database

Especifica que a transação é marcada no log.Specifies that the transaction is marked in the log. Descrição é uma cadeia de caracteres que descreve a marca.description is a string that describes the mark. Um descrição mais de 128 caracteres é truncado para 128 caracteres antes de serem armazenados na tabela msdb.dbo.A description longer than 128 characters is truncated to 128 characters before being stored in the msdb.dbo.logmarkhistory table.

Se WITH MARK for usado, o nome da transação deverá ser especificado.If WITH MARK is used, a transaction name must be specified. WITH MARK permite restaurar um log de transações para uma indicação nomeada.WITH MARK allows for restoring a transaction log to a named mark.

Comentários geraisGeneral Remarks

BEGIN TRANSACTION incrementa@TRANCOUNT em 1.BEGIN TRANSACTION increments @@TRANCOUNT by 1.

BEGIN TRANSACTION representa um ponto no qual os dados referenciados por uma conexão são lógica e fisicamente consistentes.BEGIN TRANSACTION represents a point at which the data referenced by a connection is logically and physically consistent. 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.If errors are encountered, all data modifications made after the BEGIN TRANSACTION can be rolled back to return the data to this known state of consistency. 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.Each transaction lasts until either it completes without errors and COMMIT TRANSACTION is issued to make the modifications a permanent part of the database, or errors are encountered and all modifications are erased with a ROLLBACK TRANSACTION statement.

BEGIN TRANSACTION inicia uma transação local para a conexão que emite a instrução.BEGIN TRANSACTION starts a local transaction for the connection issuing the statement. Dependendo das configurações de nível de isolamento da transação atual, muitos recursos adquiridos para aceitar as instruções Transact-SQLTransact-SQL emitidas pela conexão são fechados pela transação, até que seja completada com uma instrução COMMIT TRANSACTION ou ROLLBACK TRANSACTION.Depending on the current transaction isolation level settings, many resources acquired to support the Transact-SQLTransact-SQL statements issued by the connection are locked by the transaction until it is completed with either a COMMIT TRANSACTION or ROLLBACK TRANSACTION statement. 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.Transactions left outstanding for long periods of time can prevent other users from accessing these locked resources, and also can prevent log truncation.

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.Although BEGIN TRANSACTION starts a local transaction, it is not recorded in the transaction log until the application subsequently performs an action that must be recorded in the log, such as executing an INSERT, UPDATE, or DELETE statement. 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.An application can perform actions such as acquiring locks to protect the transaction isolation level of SELECT statements, but nothing is recorded in the log until the application performs a modification action.

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.Naming multiple transactions in a series of nested transactions with a transaction name has little effect on the transaction. Somente o primeiro nome da transação (externo) é registrado no sistema.Only the first (outermost) transaction name is registered with the system. Uma reversão para qualquer outro nome (diferente de um nome de ponto de salvamento válido) gera um erro.A rollback to any other name (other than a valid savepoint name) generates an error. Nenhuma das instruções executadas antes da reversão são, na realidade, revertidas quando ocorre o erro.None of the statements executed before the rollback is, in fact, rolled back at the time this error occurs. As instruções são revertidas somente quando a transação externa é revertida.The statements are rolled back only when the outer transaction is rolled back.

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:The local transaction started by the BEGIN TRANSACTION statement is escalated to a distributed transaction if the following actions are performed before the statement is committed or rolled back:

  • Uma instrução de INSERT, DELETE ou UPDATE que faz referência a uma tabela remota em um servidor vinculado é executada.An INSERT, DELETE, or UPDATE statement that references a remote table on a linked server is executed. A instrução INSERT, UPDATE ou DELETE falhará se o provedor de OLE DB usado para acessar o servidor vinculado não suporta a interface ITransactionJoin.The INSERT, UPDATE, or DELETE statement fails if the OLE DB provider used to access the linked server does not support the ITransactionJoin interface.

  • Uma chamada é feita para um procedimento armazenado remoto quando a opção REMOTE_PROC_TRANSACTIONS é definida como ON.A call is made to a remote stored procedure when the REMOTE_PROC_TRANSACTIONS option is set to ON.

    A cópia local do SQL ServerSQL Server se torna o controlador da transação e usa o MS DTC (Coordenador de Transações Distribuídas da MicrosoftMicrosoft) para gerenciar a transação distribuída.The local copy of SQL ServerSQL Server becomes the transaction controller and uses MicrosoftMicrosoft Distributed Transaction Coordinator (MS DTC) to manage the distributed transaction.

    Uma transação pode ser executada explicitamente como uma transação distribuída usando BEGIN DISTRIBUTED TRANSACTION.A transaction can be explicitly executed as a distributed transaction by using BEGIN DISTRIBUTED TRANSACTION. Para obter mais informações, consulte BEGIN DISTRIBUTED TRANSACTION ( Transact-SQL ) .For more information, see BEGIN DISTRIBUTED TRANSACTION (Transact-SQL).

    Quando SET IMPLICIT_TRANSACTIONS está definida como ON, a instrução BEGIN TRANSACTION cria duas transações aninhadas.When SET IMPLICIT_TRANSACTIONS is set to ON, a BEGIN TRANSACTION statement creates two nested transactions. Para obter mais informações, consulte SET IMPLICIT_TRANSACTIONS ( Transact-SQL )For more information see, SET IMPLICIT_TRANSACTIONS (Transact-SQL)

Transações marcadasMarked Transactions

A opção WITH MARK faz com que o nome da transação ser inserido no log de transações.The WITH MARK option causes the transaction name to be placed in the transaction log. Ao restaurar um banco de dados a um estado anterior, a transação marcada pode ser usada em lugar de uma data e hora.When restoring a database to an earlier state, the marked transaction can be used in place of a date and time. Para obter mais informações, consulte usar transações marcadas para recuperar bancos de dados relacionados consistentemente ( Modelo de recuperação completa ) e restauração ( Transact-SQL ) .For more information, see Use Marked Transactions to Recover Related Databases Consistently (Full Recovery Model) and 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.Additionally, transaction log marks are necessary if you need to recover a set of related databases to a logically consistent state. Prefixos podem ser colocados nos logs de transação dos bancos de dados relacionados por meio de uma transação distribuída.Marks can be placed in the transaction logs of the related databases by a distributed transaction. Recuperar o conjunto de bancos de dados relacionados a estes prefixos resulta em um conjunto de bancos de dados que são transacionalmente consistentes.Recovering the set of related databases to these marks results in a set of databases that are transactionally consistent. A inserção de marcas em bancos de dados relacionados requer procedimentos especiais.Placement of marks in related databases requires special procedures.

A marca é inserida no log de transações somente se o banco de dados for atualizado pela transação marcada.The mark is placed in the transaction log only if the database is updated by the marked transaction. As transações que não modificam dados não têm prefixos.Transactions that do not modify data are not marked.

BEGIN TRAN novo_nome WITH MARK podem ser aninhada dentro de uma transação já existente que não está marcada.BEGIN TRAN new_name WITH MARK can be nested within an already existing transaction that is not marked. Ao fazer isso, novo_nome torna-se o nome da marca da transação, apesar do nome que a transação pode já ter sido fornecida.Upon doing so, new_name becomes the mark name for the transaction, despite the name that the transaction may already have been given. No exemplo a seguir, M2 é o nome do prefixo.In the following example, M2 is the name of the mark.

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):When nesting transactions, trying to mark a transaction that is already marked results in a warning (not error) message:

"BEGIN TRAN T1 WITH MARK ...;""BEGIN TRAN T1 WITH MARK ...;"

"UPDATE table1 ...;""UPDATE table1 ...;"

"BEGIN TRAN M2 WITH MARK ...;""BEGIN TRAN M2 WITH MARK ...;"

"Server: Msg 3920, Level 16, State 1, Line 3""Server: Msg 3920, Level 16, State 1, Line 3"

“A opção WITH MARK é aplicável somente ao primeiro BEGIN TRAN WITH MARK.""WITH MARK option only applies to the first BEGIN TRAN WITH MARK."

"A opção é ignorada.""The option is ignored."

PermissõesPermissions

Requer associação à função public.Requires membership in the public role.

ExemplosExamples

A.A. Usando uma transação explícitaUsing an explicit transaction

Aplica-se a: SQL Server (começando com o 2008), o banco de dados do SQL Azure, o Azure SQL Data Warehouse, Parallel Data WarehouseAPPLIES TO: SQL Server (starting with 2008), Azure SQL Database, Azure SQL Data Warehouse, Parallel Data Warehouse

Este exemplo usa o AdventureWorks.This example uses AdventureWorks.

BEGIN TRANSACTION;  
DELETE FROM HumanResources.JobCandidate  
    WHERE JobCandidateID = 13;  
COMMIT;  

B.B. Reverter uma transaçãoRolling back a transaction

Aplica-se a: SQL Server (começando com o 2008), o banco de dados do SQL Azure, o Azure SQL Data Warehouse, Parallel Data WarehouseAPPLIES TO: SQL Server (starting with 2008), Azure SQL Database, Azure SQL Data Warehouse, Parallel Data Warehouse

O exemplo a seguir mostra o efeito da reversão de uma transação.The following example shows the effect of rolling back a transaction. Neste exemplo, a instrução ROLLBACK reverterá a instrução INSERT, mas a tabela criada ainda existirão.In this example, the ROLLBACK statement will roll back the INSERT statement, but the created table will still exist.


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

C.C. Nomeando uma transaçãoNaming a transaction

Aplica-se a: SQL Server (começando com o 2008), o banco de dados do SQL AzureAPPLIES TO: SQL Server (starting with 2008), Azure SQL Database

O exemplo a seguir mostra como nomear uma transação.The following example shows how to name a transaction.

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

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

COMMIT TRANSACTION @TranName;  
GO  

D.D. Marcando uma transaçãoMarking a transaction

Aplica-se a: SQL Server (começando com o 2008), o banco de dados do SQL AzureAPPLIES TO: SQL Server (starting with 2008), Azure SQL Database

O exemplo a seguir mostra como marcar uma transação.The following example shows how to mark a transaction. A transação CandidateDelete é marcada.The transaction CandidateDelete is marked.

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émSee Also

BEGIN DISTRIBUTED TRANSACTION (Transact-SQL) BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)
COMMIT TRANSACTION (Transact-SQL) COMMIT TRANSACTION (Transact-SQL)
TRABALHO de confirmação ( Transact-SQL ) COMMIT WORK (Transact-SQL)
ROLLBACK TRANSACTION (Transact-SQL) ROLLBACK TRANSACTION (Transact-SQL)
ROLLBACK WORK ( Transact-SQL ) ROLLBACK WORK (Transact-SQL)
SAVE TRANSACTION (Transact-SQL)SAVE TRANSACTION (Transact-SQL)