Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Se aplica a:SQL Server
Azure SQL Database
Instancia
administrada de Azure SQLAzure Synapse Analytics
Analytics Platform System (PDW)
Almacenamiento en Microsoft Fabric
Base de datos SQL 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
Syntax
Sintaxis de SQL Server, Azure SQL Database, Azure SQL Managed Instance, SQL Database en Microsoft Fabric.
BEGIN { TRAN | TRANSACTION }
[ { transaction_name | @tran_name_variable }
[ WITH MARK [ 'description' ] ]
]
[ ; ]
Sintaxis para Fabric Data Warehouse, Azure Synapse Analytics y Analytics Platform System (PDW).
BEGIN { TRAN | TRANSACTION }
[ ; ]
Arguments
transaction_name
Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores, Azure SQL Database, Azure SQL Managed Instance, SQL Database en Microsoft Fabric.
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 BEGIN...COMMIT instrucciones o BEGIN...ROLLBACK .
transaction_name siempre distingue mayúsculas de minúsculas, incluso cuando la instancia del motor de base de datos 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, Azure SQL Managed Instance, SQL Database en Microsoft Fabric.
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.
CON MARK [ 'descripción' ]
Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores, Azure SQL Database, Azure SQL Managed Instance, SQL Database en Microsoft Fabric.
Especifica que la transacción está marcada en el registro de transacciones.
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 a un punto identificado por la marca.
Remarks
BEGIN TRANSACTION
@@TRANCOUNT incrementa por 1.
BEGIN TRANSACTION representa un punto en el que los datos a los que hace referencia una sesión tienen un determinado estado de coherencia. 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 COMMIT TRANSACTION que se emite para realizar las modificaciones en una parte permanente de la base de datos o todas las modificaciones se borran con una ROLLBACK TRANSACTION instrucción .
Una transacción se puede revertir automáticamente si se produce un error de anulación de transacciones o si se produce algún error en tiempo de ejecución y la XACT_ABORT opción de sesión se establece en ON. Para obtener más información, consulte SET XACT_ABORT.
BEGIN TRANSACTION inicia una transacción local para la sesión que emite la instrucción . Según la configuración actual del nivel de aislamiento de transacción, los recursos adquiridos para admitir las instrucciones Transact-SQL emitidas por la sesió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 largos períodos de tiempo pueden impedir que otras sesiones accedan a estos recursos bloqueados y también pueden evitar el truncamiento del registro de transacciones y la limpieza del almacén de versiones.
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 vez iniciada una transacción, el motor de base de datos puede realizar acciones como adquirir bloqueos para proteger el nivel de aislamiento de transacciones de SELECT las instrucciones, pero no se registra nada en el registro de transacciones hasta que la aplicación realiza una acción de modificación.
Después de BEGIN TRANSACTIONemitir , puede volver a emitir BEGIN TRANSACTION para iniciar una o varias transacciones internas. Aunque puede especificar transaction_name para una transacción interna, solo se registra el primer nombre de transacción (más externo) en el sistema. Una reversión a cualquier otro nombre (que no sea un nombre de punto de guardado válido) genera un error sin revertir ninguna de las instrucciones. Solo se revierten las instrucciones cuando se revierte la transacción externa.
La transacción local iniciada por la BEGIN TRANSACTION instrucción se promueve a una transacción distribuida si se realizan las siguientes acciones antes de confirmar o revertir la instrucción:
Se
INSERTejecuta una instrucción ,DELETEoUPDATEque hace referencia a una tabla remota en un servidor vinculado. Se produce un error en laINSERTinstrucción ,UPDATEoDELETEsi el proveedor OLE DB usado para acceder al servidor vinculado no admite laITransactionJoininterfaz .Una llamada se realiza a un procedimiento almacenado remoto cuando la
REMOTE_PROC_TRANSACTIONSopción se establece enON.
La instancia local del motor de base de datos se convierte en el controlador de transacciones y usa 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 una transacción externa y interna, estableciendo @@TRANCOUNT en 2. Para más información, consulte SET IMPLICIT_TRANSACTIONS.
Nota:
El motor de base de datos no admite transacciones anidadas administrables de forma independiente. Confirmación de una disminución de @@TRANCOUNT transacción interna, pero no tiene otros efectos. Una reversión de una transacción interna siempre revierte la transacción externa, a menos que exista un punto de guardado y se especifique en la ROLLBACK instrucción .
Transacciones marcadas
La WITH MARK opción hace que el nombre de la transacción se registre en el registro de transacciones. Al restaurar una base de datos a un estado anterior, la transacción marcada se puede usar para especificar el punto de restauración 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, las marcas de registro de transacciones son necesarias si necesita recuperar un conjunto de bases de datos relacionadas con un determinado estado compartido de coherencia. Una aplicación que tenga en cuenta el estado de coherencia de cada base de datos puede colocar marcas en los registros de transacciones de las bases de datos relacionadas mediante una base de datos cruzada o una transacción distribuida. La recuperación del conjunto de bases de datos relacionadas con estas marcas da como resultado un conjunto de bases de datos que tienen un estado compartido conocido de coherencia.
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 se registran en el registro.
BEGIN TRANSACTION <new_name> WITH MARK se puede usar al iniciar una transacción interna. En ese caso, <new_name> se convierte en el nombre de marca de la transacción si la transacción externa no está marcada. En el siguiente ejemplo conceptual, M2 es el nombre de la marca.
BEGIN TRAN T1;
UPDATE table1 ...;
BEGIN TRAN M2 WITH MARK;
UPDATE table2 ...;
SELECT column1 FROM table1;
COMMIT TRAN M2;
UPDATE table3 ...;
COMMIT TRAN T1;
Al marcar una transacción interna, 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.
Permissions
Requiere la pertenencia al rol public.
Examples
Los ejemplos de código de este artículo usan la base de datos de ejemplo de AdventureWorks2025 o AdventureWorksDW2025, que puede descargar de la página principal de Ejemplos de Microsoft SQL Server y proyectos de comunidad.
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 Managed Instance, SQL Database en Microsoft Fabric, Azure Synapse Analytics, Analytics Platform System (PDW)
BEGIN TRANSACTION;
DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;
COMMIT TRANSACTION;
B. Revertir una transacción
Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores, Azure SQL Database, Azure SQL Managed Instance, SQL Database en Microsoft Fabric, 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 Managed Instance, SQL Database en Microsoft Fabric
En el siguiente ejemplo se muestra cómo asignar un nombre a una transacción.
DECLARE @TranName AS VARCHAR (20);
SELECT @TranName = 'MyTransaction';
BEGIN TRANSACTION @TranName;
DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;
COMMIT TRANSACTION @TranName;
D. Marcar una transacción
Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores, Azure SQL Database, Azure SQL Managed Instance, SQL Database en Microsoft Fabric
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';
DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;
COMMIT TRANSACTION CandidateDelete;