Compartir a través de


COMMIT 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 SQL Database en Microsoft Fabric

Marca el final de una transacción correcta, implícita o explícita. Si @@TRANCOUNT es 1, COMMIT TRANSACTION realiza todas las modificaciones de datos desde el inicio de la transacción una parte permanente de la base de datos, libera los recursos de la transacción y disminuye @@TRANCOUNT en 0. Cuando @@TRANCOUNT es mayor que 1, COMMIT TRANSACTION @@TRANCOUNT disminuye solo en 1 y la transacción permanece activa.

Convenciones de sintaxis de Transact-SQL

Sintaxis

Sintaxis para SQL Server y Azure SQL Database.

COMMIT [ { TRAN | TRANSACTION }
    [ transaction_name | @tran_name_variable ] ]
    [ WITH ( DELAYED_DURABILITY = { OFF | ON } ) ]
[ ; ]

Sintaxis para Synapse Data Warehouse en Microsoft Fabric, Azure Synapse Analytics y base de datos de almacenamiento de datos paralelos.

COMMIT [ TRAN | TRANSACTION ]
[ ; ]

Argumentos

transaction_name

Se aplica a: SQL Server y Azure SQL Database

Se omite en el Motor de base de datos de SQL Server. transaction_name especifica un nombre de transacción asignado por un objeto anteriorBEGIN TRANSACTION. transaction_name debe cumplir con las reglas para identificadores, pero no puede superar los 32 caracteres. transaction_name indica a los programadores a los que anidado BEGIN TRANSACTION el COMMIT TRANSACTION objeto está asociado.

@tran_name_variable

Se aplica a: SQL Server y Azure SQL Database

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 32 caracteres. Los caracteres restantes se truncan.

WITH DELAYED_DURABILITY = { OFF | ON }

Se aplica a: SQL Server y Azure SQL Database

La opción que solicita esta transacción se confirma con la durabilidad diferida. La solicitud se omite si la base de datos se modificó con DELAYED_DURABILITY = DISABLED o DELAYED_DURABILITY = FORCED. Para saber más, vea Control de la durabilidad de las transacciones.

Comentarios

Es responsabilidad del programador de Transact-SQL emitir COMMIT TRANSACTION solo en un momento en el que todos los datos a los que hace referencia la transacción son lógicos.

Si la transacción confirmada era una transacción distribuida de Transact-SQL, COMMIT TRANSACTION desencadena MS DTC para usar un protocolo de confirmación en dos fases para confirmar todos los servidores implicados en la transacción. Si una transacción local afecta a dos o más bases de datos de la misma instancia del Motor de base de datos, la instancia utiliza una confirmación interna en dos fases para confirmar todas las bases de datos involucradas en la transacción.

Cuando se utiliza en transacciones anidadas, las confirmaciones de las transacciones anidadas no liberan recursos ni hacen permanentes sus modificaciones. Las modificaciones sobre los datos solo quedan permanentes y se liberan los recursos cuando se confirma la transacción más externa. Cada COMMIT TRANSACTION uno emitido cuando @@TRANCOUNT es mayor que un simple decremento @@TRANCOUNT en 1. Cuando @@TRANCOUNT finalmente se disminuye a 0, se confirma toda la transacción externa. Dado que el Motor de base de datos omite transaction_name, emite un COMMIT TRANSACTION que hace referencia al nombre de una transacción externa cuando hay transacciones internas pendientes solo disminuye @@TRANCOUNT en 1.

Si se emite un COMMIT TRANSACTION cuando @@TRANCOUNT es cero, se produce un error; no hay ningún objeto correspondiente BEGIN TRANSACTION.

No se puede revertir una transacción después de emitir una COMMIT TRANSACTION instrucción, ya que las modificaciones de datos se realizaron una parte permanente de la base de datos.

El Motor de base de datos incrementa el recuento de transacciones de una instrucción solo cuando el recuento de transacciones es 0 al inicio de la instrucción.

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 puede descargar desde la página principal de Ejemplos y proyectos de la comunidad de Microsoft SQL Server.

A Confirmación de una transacción

Se aplica a: SQL Server, Azure SQL Database, Azure Synapse Analytics y Analytics Platform System (PDW)

En el siguiente ejemplo se elimina a un candidato a un puesto de trabajo.

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

B. Confirmación de una transacción anidada

Se aplica a: SQL Server y Azure SQL Database

En el siguiente ejemplo se crea una tabla, se generan tres niveles de transacciones anidadas y después se confirma la transacción anidada. Aunque cada instrucción COMMIT TRANSACTION cuenta con un parámetro transaction_name, no existe ninguna relación entre las instrucciones COMMIT TRANSACTION y BEGIN TRANSACTION. Los parámetros transaction_name ayudan al programador a asegurarse de que escribe el número apropiado de confirmaciones para reducir @@TRANCOUNT hasta 0, confirmando así la transacción más externa.

IF OBJECT_ID(N'TestTran', N'U') IS NOT NULL
    DROP TABLE TestTran;
GO

CREATE TABLE TestTran (
    Cola INT PRIMARY KEY,
    Colb CHAR(3)
);
GO

-- This statement sets @@TRANCOUNT to 1.
BEGIN TRANSACTION OuterTran;

PRINT N'Transaction count after BEGIN OuterTran = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));

INSERT INTO TestTran
VALUES (1, 'aaa');

-- This statement sets @@TRANCOUNT to 2.
BEGIN TRANSACTION Inner1;

PRINT N'Transaction count after BEGIN Inner1 = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));

INSERT INTO TestTran
VALUES (2, 'bbb');

-- This statement sets @@TRANCOUNT to 3.
BEGIN TRANSACTION Inner2;

PRINT N'Transaction count after BEGIN Inner2 = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));

INSERT INTO TestTran
VALUES (3, 'ccc');

-- This statement decrements @@TRANCOUNT to 2.
-- Nothing is committed.
COMMIT TRANSACTION Inner2;

PRINT N'Transaction count after COMMIT Inner2 = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));

-- This statement decrements @@TRANCOUNT to 1.
-- Nothing is committed.
COMMIT TRANSACTION Inner1;

PRINT N'Transaction count after COMMIT Inner1 = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));

-- This statement decrements @@TRANCOUNT to 0 and
-- commits outer transaction OuterTran.
COMMIT TRANSACTION OuterTran;

PRINT N'Transaction count after COMMIT OuterTran = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));