BEGIN TRANSACTION (Transact-SQL)
Se aplica a: SQL Server Azure SQL Database Azure SQL Instancia administrada Azure Synapse Analytics Analytics Platform System (PDW) Warehouse en Microsoft Fabric
Marca el punto de inicio de una transacción local explícita. Las transacciones explícitas comienzan con la BEGIN TRANSACTION
instrucción y terminan con la COMMIT
instrucción o ROLLBACK
.
Convenciones de sintaxis de Transact-SQL
Sintaxis
Sintaxis para SQL Server, Azure SQL Database y Azure SQL Instancia administrada.
BEGIN { TRAN | TRANSACTION }
[ { transaction_name | @tran_name_variable }
[ WITH MARK [ 'description' ] ]
]
[ ; ]
Sintaxis para Synapse Data Warehouse en Microsoft Fabric, Azure Synapse Analytics and Analytics Platform System (PDW).
BEGIN { TRAN | TRANSACTION }
[ ; ]
Argumentos
transaction_name
Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores, Azure SQL Database y Azure SQL Instancia administrada
Nombre asignado a la transacción. transaction_name debe cumplir las reglas de los identificadores, pero no se permiten identificadores de más de 32 caracteres. Use nombres de transacción solo en el par más externo de instrucciones anidadas BEGIN...COMMIT
o BEGIN...ROLLBACK
. transaction_name siempre distingue mayúsculas de minúsculas, incluso cuando la instancia de SQL Server no distingue mayúsculas de minúsculas.
@tran_name_variable
Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores, Azure SQL Database y Azure SQL Instancia administrada
Nombre de una variable definida por el usuario que contiene un nombre de transacción válido. La variable debe declararse con un tipo de datos char, varchar, nchar o nvarchar. Si se pasan más de 32 caracteres a la variable, solo se usan los primeros 32 caracteres. Los caracteres restantes se truncan.
WITH MARK [ 'description' ]
Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores, Azure SQL Database y Azure SQL Instancia administrada
Especifica que la transacción está marcada en el registro. description es una cadena que describe la marca. Una descripción de más de 128 caracteres se trunca a 128 caracteres antes de almacenarse en la msdb.dbo.logmarkhistory
tabla.
Si WITH MARK
se usa, se debe especificar un nombre de transacción. WITH MARK
permite restaurar un registro de transacciones en una marca con nombre.
Comentarios
BEGIN TRANSACTION
@@TRANCOUNT
incrementa por 1
.
BEGIN TRANSACTION
representa un punto en el que los datos a los que hace referencia una conexión son lógicos y físicamente coherentes. Si se detectan errores, todas las modificaciones de datos realizadas después BEGIN TRANSACTION
de que se pueda revertir para devolver los datos a este estado conocido de coherencia. Cada transacción dura hasta que se completa sin errores y COMMIT TRANSACTION
se emite para realizar las modificaciones en una parte permanente de la base de datos, o se detectan errores y todas las modificaciones se borran con una ROLLBACK TRANSACTION
instrucción .
BEGIN TRANSACTION
inicia una transacción local para la conexión que emite la instrucción . Según la configuración actual del nivel de aislamiento de transacción, muchos recursos adquiridos para admitir las instrucciones Transact-SQL emitidas por la conexión están bloqueadas por la transacción hasta que se completa con una COMMIT TRANSACTION
instrucción o ROLLBACK TRANSACTION
. 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.
Aunque BEGIN TRANSACTION
inicia una transacción local, no se registra en el registro de transacciones hasta que la aplicación realiza una acción que se debe registrar en el registro, como ejecutar una INSERT
instrucción , UPDATE
o DELETE
. Una aplicación puede realizar acciones como adquirir bloqueos para proteger el nivel de aislamiento de transacciones de SELECT
instrucciones, pero no se registra nada en el registro hasta que la aplicación realiza una acción de modificación.
Asignar un nombre a varias transacciones en un conjunto de transacciones anidadas afecta mínimamente a la transacción. Solamente el nombre de la primera transacción (la más externa) se registra en el sistema. Revertir a otro nombre (que no sea un nombre de punto de retorno válido) genera un 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. Solo se revierten las instrucciones cuando se revierte la transacción externa.
La transacción local iniciada por la BEGIN TRANSACTION
instrucción se escala a una transacción distribuida si se realizan las siguientes acciones antes de confirmar o revertir la instrucción:
Se
INSERT
ejecuta una instrucción ,DELETE
oUPDATE
que hace referencia a una tabla remota en un servidor vinculado. Se produce un error en laINSERT
instrucción ,UPDATE
oDELETE
si el proveedor OLE DB usado para acceder al servidor vinculado no admite laITransactionJoin
interfaz .Una llamada se realiza a un procedimiento almacenado remoto cuando la
REMOTE_PROC_TRANSACTIONS
opción se establece enON
.
La copia local de SQL Server se convierte en el controlador de la transacción y utiliza el Coordinador de transacciones distribuidas de Microsoft (MS DTC) para administrar la transacción distribuida.
Una transacción se puede ejecutar explícitamente como una transacción distribuida mediante BEGIN DISTRIBUTED TRANSACTION
. Para obtener más información, vea BEGIN DISTRIBUTED TRANSACTION.
Cuando SET IMPLICIT_TRANSACTIONS
se establece ON
en , una BEGIN TRANSACTION
instrucción crea dos transacciones anidadas. Para más información, consulte SET IMPLICIT_TRANSACTIONS.
Transacciones marcadas
La WITH MARK
opción hace que el nombre de la transacción se coloque en el registro de transacciones. Al restaurar una base de datos a un estado anterior, la transacción marcada se puede usar en lugar de una fecha y hora. Para obtener más información, vea Usar transacciones marcadas para recuperar bases de datos relacionadas de forma coherente e instrucciones RESTORE.
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. Una transacción distribuida puede colocar marcas en los registros de transacción de las bases de datos relacionadas. 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. La colocación de las marcas en las bases de datos relacionadas requiere procedimientos especiales.
La marca se coloca en el registro de transacciones solamente si la transacción marcada actualiza la base de datos. Las transacciones que no modifican los datos no están marcadas.
BEGIN TRANSACTION <new_name> WITH MARK
se puede anidar dentro de una transacción ya existente que no está marcada. Al hacerlo, <new_name>
se convierte en el nombre de marca de la transacción, a pesar del nombre que puede que ya se haya dado a la transacción. En el siguiente ejemplo, M2
es el nombre de la marca.
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, recibirá el siguiente mensaje de advertencia si intenta marcar una transacción que ya 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.
Permisos
Debe pertenecer al rol public .
Ejemplos
Los ejemplos de código de Transact-SQL de este artículo utilizan la base de datos de ejemplo AdventureWorks2022
o AdventureWorksDW2022
, que se pueden descargar desde la página principal de Ejemplos y proyectos de la comunidad de Microsoft SQL Server.
A Uso de una transacción explícita
Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores, Azure SQL Database, Azure SQL Instancia administrada, Azure Synapse Analytics, Analytics Platform System (PDW)
BEGIN TRANSACTION;
DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;
COMMIT;
B. Revertir una transacción
Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores, Azure SQL Database, Azure SQL Instancia administrada, Azure Synapse Analytics, Analytics Platform System (PDW)
En el ejemplo siguiente se muestra el efecto de revertir una transacción. En este ejemplo, la ROLLBACK
instrucción revierte la INSERT
instrucción , pero la tabla creada todavía existe.
CREATE TABLE ValueTable (id INT);
BEGIN TRANSACTION;
INSERT INTO ValueTable VALUES(1);
INSERT INTO ValueTable VALUES(2);
ROLLBACK;
C. Asignar un nombre a una transacción
Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores, Azure SQL Database, Azure SQL Instancia administrada
En el siguiente ejemplo se muestra cómo asignar un nombre a una transacción.
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 una transacción
Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores, Azure SQL Database, Azure SQL Instancia administrada
En el siguiente ejemplo se muestra cómo marcar una transacción. Se marca la transacción CandidateDelete
.
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