Compartir vía


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 INSERTinstrucción , UPDATEo 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 INSERTejecuta una instrucción , DELETEo UPDATE que hace referencia a una tabla remota en un servidor vinculado. Se produce un error en la INSERTinstrucción , UPDATEo DELETE si el proveedor OLE DB usado para acceder al servidor vinculado no admite la ITransactionJoin interfaz .

  • Una llamada se realiza a un procedimiento almacenado remoto cuando la REMOTE_PROC_TRANSACTIONS opción se establece en ON.

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 ONen , 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