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

SE APLICA A: síSQL Server síAzure SQL Database síAzure Synapse Analytics (SQL DW) síAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse

Marca el punto de inicio de una transacción local explícita.Marks the starting point of an explicit, local transaction. Las transacciones explícitas empiezan con la instrucción BEGIN TRANSACTION y acaban con la instrucción COMMIT o ROLLBACK.Explicit transactions start with the BEGIN TRANSACTION statement and end with the COMMIT or ROLLBACK statement.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

--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
SE APLICA A: SQL Server (a partir de 2008), Azure SQL DatabaseAPPLIES TO: SQL Server (starting with 2008), Azure SQL Database

Es el nombre asignado a la transacción.Is the name assigned to the transaction. transaction_name debe cumplir las reglas de los identificadores, pero no se admiten identificadores de más de 32 caracteres.transaction_name must conform to the rules for identifiers, but identifiers longer than 32 characters are not allowed. Utilice nombres de transacciones solamente en la pareja más externa de instrucciones BEGIN…COMMIT o BEGIN…ROLLBACK anidadas.Use transaction names only on the outermost pair of nested BEGIN...COMMIT or BEGIN...ROLLBACK statements. transaction_name siempre distingue mayúsculas de minúsculas, incluso cuando la instancia de SQL ServerSQL Server no distingue mayúsculas 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
SE APLICA A: SQL Server (a partir de 2008), Azure SQL DatabaseAPPLIES TO: SQL Server (starting with 2008), Azure SQL Database

Se trata del nombre de una variable definida por el usuario que contiene un nombre de transacción válido.Is the name of a user-defined variable containing a valid transaction name. La variable debe declararse con un tipo de datos char, varchar, nchar o nvarchar.The variable must be declared with a char, varchar, nchar, or nvarchar data type. Si se pasan más de 32 caracteres a la variable, solo se utilizarán los primeros 32; el resto de caracteres se truncará.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 [ 'description' ]WITH MARK [ 'description' ]
SE APLICA A: SQL Server (a partir de 2008), Azure SQL DatabaseAPPLIES TO: SQL Server (starting with 2008), Azure SQL Database

Especifica que la transacción está marcada en el registro.Specifies that the transaction is marked in the log. description es una cadena que describe la marca.description is a string that describes the mark. Un valor description de más de 128 caracteres se trunca en 128 antes de almacenarse en la tabla msdb.dbo.logmarkhistory.A description longer than 128 characters is truncated to 128 characters before being stored in the msdb.dbo.logmarkhistory table.

Si utiliza WITH MARK, debe especificar un nombre de transacción.If WITH MARK is used, a transaction name must be specified. WITH MARK permite restaurar un registro de transacciones hasta una marca con nombre.WITH MARK allows for restoring a transaction log to a named mark.

Notas generalesGeneral Remarks

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

BEGIN TRANSACTION representa un punto en el que los datos a los que hace referencia una conexión son lógica y físicamente coherentes.BEGIN TRANSACTION represents a point at which the data referenced by a connection is logically and physically consistent. Si se producen errores, se pueden revertir todas las modificaciones realizadas en los datos después de BEGIN TRANSACTION para devolver los datos al estado conocido de coherencia.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 transacción dura hasta que se completa sin errores y se emite COMMIT TRANSACTION para hacer que las modificaciones sean una parte permanente de la base de datos, o hasta que se produzcan errores y se borren todas las modificaciones con la instrucción 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 una transacción local para la conexión que emite la instrucción.BEGIN TRANSACTION starts a local transaction for the connection issuing the statement. Según la configuración del nivel de aislamiento de la transacción actual, la transacción bloquea muchos recursos adquiridos para aceptar las instrucciones Transact-SQLTransact-SQL emitidas por la conexión hasta que la misma finaliza con una instrucción COMMIT TRANSACTION o 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. Las transacciones que quedan pendientes durante mucho tiempo pueden impedir que otros usuarios tengan acceso a estos recursos bloqueados y pueden impedir también el truncamiento del registro.Transactions left outstanding for long periods of time can prevent other users from accessing these locked resources, and also can prevent log truncation.

Aunque BEGIN TRANSACTION inicia una transacción local, ésta no se guardará en el registro de transacciones hasta que la aplicación realice posteriormente una acción que se deba almacenar en el registro, como la ejecución de una instrucción INSERT, UPDATE o 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. Una aplicación puede realizar acciones tales como adquirir bloqueos para proteger el nivel de aislamiento de transacción de instrucciones SELECT, pero no se guarda ningún dato en el registro hasta que la aplicación realiza una acción de modificación.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.

Asignar un nombre a varias transacciones en un conjunto de transacciones anidadas afecta mínimamente a la transacción.Naming multiple transactions in a series of nested transactions with a transaction name has little effect on the transaction. Solamente el nombre de la primera transacción (la más externa) se registra en el sistema.Only the first (outermost) transaction name is registered with the system. Revertir a otro nombre (que no sea un nombre de punto de retorno válido) genera un error.A rollback to any other name (other than a valid savepoint name) generates an error. De hecho, no se revierte ninguna de las instrucciones ejecutadas antes de la operación de revertir en el momento en que se produce este error.None of the statements executed before the rollback is, in fact, rolled back at the time this error occurs. Solo se revierten las instrucciones cuando se revierte la transacción externa.The statements are rolled back only when the outer transaction is rolled back.

La transacción local iniciada por la instrucción BEGIN TRANSACTION aumenta al nivel de transacción distribuida si se realizan las siguientes acciones antes de confirmarla o revertirla: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:

  • Se ejecuta una instrucción INSERT, DELETE o UPDATE que hace referencia a una tabla remota de un servidor vinculado.An INSERT, DELETE, or UPDATE statement that references a remote table on a linked server is executed. La instrucción INSERT, UPDATE o DELETE causa un error si el proveedor OLE DB usado para obtener acceso al servidor vinculado no es compatible con la interfaz 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.

  • Se realiza una llamada a un procedimiento almacenado remoto cuando la opción REMOTE_PROC_TRANSACTIONS es ON.A call is made to a remote stored procedure when the REMOTE_PROC_TRANSACTIONS option is set to ON.

La copia local de SQL ServerSQL Server se convierte en el controlador de la transacción y utiliza el Coordinador de transacciones distribuidas de MicrosoftMicrosoft (MS DTC) para administrar la transacción distribuida.The local copy of SQL ServerSQL Server becomes the transaction controller and uses MicrosoftMicrosoft Distributed Transaction Coordinator (MS DTC) to manage the distributed transaction.

Una transacción se puede ejecutar explícitamente como una transacción distribuida utilizando BEGIN DISTRIBUTED TRANSACTION.A transaction can be explicitly executed as a distributed transaction by using BEGIN DISTRIBUTED TRANSACTION. Para obtener más información, vea BEGIN DISTRIBUTED TRANSACTION (Transact-SQL).For more information, see BEGIN DISTRIBUTED TRANSACTION (Transact-SQL).

Cuando SET IMPLICIT_TRANSACTIONS está configurado en ON, una instrucción BEGIN TRANSACTION abrirá dos transacciones anidadas.When SET IMPLICIT_TRANSACTIONS is set to ON, a BEGIN TRANSACTION statement creates two nested transactions. Para más información, vea SET IMPLICIT_TRANSACTIONS (Transact-SQL)For more information see, SET IMPLICIT_TRANSACTIONS (Transact-SQL)

Transacciones marcadasMarked Transactions

La opción WITH MARK coloca el nombre de la transacción en el registro de transacciones.The WITH MARK option causes the transaction name to be placed in the transaction log. Al restaurar una base de datos a su estado anterior, se puede utilizar la transacción marcada en lugar de la fecha y la hora.When restoring a database to an earlier state, the marked transaction can be used in place of a date and time. Para más información, vea Usar transacciones marcadas para recuperar bases de datos relacionadas sistemáticamente (modelo de recuperación completa) y RESTORE (Transact-SQL).For more information, see Use Marked Transactions to Recover Related Databases Consistently (Full Recovery Model) and RESTORE (Transact-SQL).

Además, se necesitan las marcas del registro de transacciones si tiene la intención de recuperar un conjunto de bases de datos relacionadas a un estado coherente lógicamente.Additionally, transaction log marks are necessary if you need to recover a set of related databases to a logically consistent state. Una transacción distribuida puede colocar marcas en los registros de transacción de las bases de datos relacionadas.Marks can be placed in the transaction logs of the related databases by a distributed transaction. Recuperar el conjunto de bases de datos relacionadas hasta estas marcas da como resultado un conjunto de bases de datos coherente en cuanto a las transacciones.Recovering the set of related databases to these marks results in a set of databases that are transactionally consistent. La colocación de las marcas en las bases de datos relacionadas requiere procedimientos especiales.Placement of marks in related databases requires special procedures.

La marca se coloca en el registro de transacciones solamente si la transacción marcada actualiza la base de datos.The mark is placed in the transaction log only if the database is updated by the marked transaction. No se marcan las transacciones que no modifican los datos.Transactions that do not modify data are not marked.

Se puede anidar BEGIN TRAN new_name WITH MARK en una transacción existente que no esté marcada.BEGIN TRAN new_name WITH MARK can be nested within an already existing transaction that is not marked. De ese modo, new_name se convierte en el nombre de marca de la transacción, aunque esa transacción ya tenga uno.Upon doing so, new_name becomes the mark name for the transaction, despite the name that the transaction may already have been given. En el siguiente ejemplo, M2 es el nombre de la marca.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;  

Al anidar transacciones, intentar marcar una transacción ya marcada da lugar a un mensaje de advertencia (no de error):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 tabla1 ...;""UPDATE table1 ...;"

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

"Server: Mensaje 3920, nivel 16, estado 1, línea 3""Server: Msg 3920, Level 16, State 1, Line 3"

"La opción WITH MARK solo se aplica a la primera instrucción BEGIN TRAN WITH MARK.""WITH MARK option only applies to the first BEGIN TRAN WITH MARK."

"Se omitirá la opción.""The option is ignored."

PermisosPermissions

Debe pertenecer al rol public.Requires membership in the public role.

EjemplosExamples

A.A. Usar una transacción explícitaUsing an explicit transaction

SE APLICA A: SQL Server (a partir de 2008,) Azure SQL Database, Azure SQL Data Warehouse, Almacenamiento de datos paralelosAPPLIES TO: SQL Server (starting with 2008), Azure SQL Database, Azure SQL Data Warehouse, Parallel Data Warehouse

En este ejemplo se usa AdventureWorks.This example uses AdventureWorks.

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

B.B. Revertir una transacciónRolling back a transaction

SE APLICA A: SQL Server (a partir de 2008,) Azure SQL Database, Azure SQL Data Warehouse, Almacenamiento de datos paralelosAPPLIES TO: SQL Server (starting with 2008), Azure SQL Database, Azure SQL Data Warehouse, Parallel Data Warehouse

En el ejemplo siguiente se muestra el efecto de revertir una transacción.The following example shows the effect of rolling back a transaction. En este ejemplo, la instrucción ROLLBACK revertirá la instrucción INSERT, pero la tabla creada seguirá existiendo.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. Asignar un nombre a una transacciónNaming a transaction

SE APLICA A: SQL Server (a partir de 2008), Azure SQL DatabaseAPPLIES TO: SQL Server (starting with 2008), Azure SQL Database

En el siguiente ejemplo se muestra cómo asignar un nombre a una transacción.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. Marcar una transacciónMarking a transaction

SE APLICA A: SQL Server (a partir de 2008), Azure SQL DatabaseAPPLIES TO: SQL Server (starting with 2008), Azure SQL Database

En el siguiente ejemplo se muestra cómo marcar una transacción.The following example shows how to mark a transaction. Se marca la transacción CandidateDelete.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 tambiénSee Also

BEGIN DISTRIBUTED TRANSACTION (Transact-SQL) BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)
COMMIT TRANSACTION (Transact-SQL) COMMIT TRANSACTION (Transact-SQL)
COMMIT WORK (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)