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
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 pueden 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));