COMMIT TRANSACTION (Transact-SQL)
Marca el final de una transacción correcta, implícita o explícita. Si @@TRANCOUNT es 1, COMMIT TRANSACTION hace que todas las modificaciones efectuadas sobre los datos desde el inicio de la transacción sean parte permanente de la base de datos, libera los recursos mantenidos por la transacción y reduce @@TRANCOUNT a 0. Si @@TRANCOUNT es mayor que 1, COMMIT TRANSACTION solo reduce @@TRANCOUNT en 1 y la transacción sigue activa.
Se aplica a: SQL Server (SQL Server 2008 a versión actual), Base de datos SQL de Azure (Versión inicial a versión actual). |
Convenciones de sintaxis de Transact-SQL
Sintaxis
COMMIT [ { TRAN | TRANSACTION } [ transaction_name | @tran_name_variable ] ] [ WITH ( DELAYED_DURABILITY = { OFF | ON } ) ]
[ ; ]
Argumentos
transaction_name
Motor de base de datos de SQL Server lo omite. transaction_name especifica un nombre de transacción asignado a una instrucción BEGIN TRANSACTION anterior. transaction_name* *debe cumplir con las reglas para identificadores, pero no puede superar los 32 caracteres. transaction_name se puede usar como una ayuda de legibilidad, ya que indica a los programadores a qué instrucción BEGIN TRANSACTION anidada está asociada la instrucción COMMIT TRANSACTION.@tran\_name\_variable
Se trata del 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 usarán 32 caracteres; el resto de los caracteres se truncarán.DELAYED_DURABILITY
La opción que solicita esta transacción se confirma con la durabilidad diferida. Se omitirá la solicitud si la base de datos se ha modificado con DELAYED_DURABILITY = DISABLED o DELAYED_DURABILITY = FORCED. Vea el tema Controlar la durabilidad de las transacciones para obtener más información.
Comentarios
Es responsabilidad del programador de Transact-SQL utilizar COMMIT TRANSACTION solo en el punto donde todos los datos a los que hace referencia la transacción sean lógicamente correctos.
Si la transacción que se ha confirmado era una transacción Transact-SQL distribuida, COMMIT TRANSACTION hace que MS DTC utilice el protocolo de confirmación en dos fases para confirmar los servidores involucrados 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 que se ejecute cuando @@TRANCOUNT sea mayor que 1 solo reduce @@TRANCOUNT en 1. Cuando @@TRANCOUNT llega a 0, se confirma la transacción externa entera. Como Motor de base de datos omite transaction_name, la ejecución de una instrucción COMMIT TRANSACTION que haga referencia al nombre de una transacción externa cuando haya transacciones internas pendientes solo reduce @@TRANCOUNT en 1.
La ejecución de COMMIT TRANSACTION cuando @@TRANCOUNT es 0 produce un error; no hay ninguna instrucción BEGIN TRANSACTION asociada.
No se puede revertir una transacción después de ejecutar una instrucción COMMIT TRANSACTION, porque las modificaciones sobre los datos ya son 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
Requiere la pertenencia al rol public.
Ejemplos
A.Confirmar una transacción
En el siguiente ejemplo se elimina a un candidato a un puesto de trabajo.
USE AdventureWorks2012;
GO
BEGIN TRANSACTION;
GO
DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;
GO
COMMIT TRANSACTION;
GO
B.Confirmar una transacción anidada
En el siguiente ejemplo se crea una tabla, se generan tres niveles de transacciones anidadas y después se confirma la transacción anidada. Pese a que cada instrucción COMMIT TRANSACTION cuenta con un parámetro transaction_name, no habrá ninguna relación entre las instrucciones COMMIT TRANSACTION y BEGIN TRANSACTION. Los parámetros transaction_name solo son ayudas para que el programador pueda asegurarse de que escribe el número apropiado de confirmaciones para reducir @@TRANCOUNT hasta 0, confirmando así la transacción más externa.
USE AdventureWorks2012;
GO
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;
GO
PRINT N'Transaction count after BEGIN OuterTran = '
+ CAST(@@TRANCOUNT AS nvarchar(10));
GO
INSERT INTO TestTran VALUES (1, 'aaa');
GO
-- This statement sets @@TRANCOUNT to 2.
BEGIN TRANSACTION Inner1;
GO
PRINT N'Transaction count after BEGIN Inner1 = '
+ CAST(@@TRANCOUNT AS nvarchar(10));
GO
INSERT INTO TestTran VALUES (2, 'bbb');
GO
-- This statement sets @@TRANCOUNT to 3.
BEGIN TRANSACTION Inner2;
GO
PRINT N'Transaction count after BEGIN Inner2 = '
+ CAST(@@TRANCOUNT AS nvarchar(10));
GO
INSERT INTO TestTran VALUES (3, 'ccc');
GO
-- This statement decrements @@TRANCOUNT to 2.
-- Nothing is committed.
COMMIT TRANSACTION Inner2;
GO
PRINT N'Transaction count after COMMIT Inner2 = '
+ CAST(@@TRANCOUNT AS nvarchar(10));
GO
-- This statement decrements @@TRANCOUNT to 1.
-- Nothing is committed.
COMMIT TRANSACTION Inner1;
GO
PRINT N'Transaction count after COMMIT Inner1 = '
+ CAST(@@TRANCOUNT AS nvarchar(10));
GO
-- This statement decrements @@TRANCOUNT to 0 and
-- commits outer transaction OuterTran.
COMMIT TRANSACTION OuterTran;
GO
PRINT N'Transaction count after COMMIT OuterTran = '
+ CAST(@@TRANCOUNT AS nvarchar(10));
GO
Vea también
Referencia
BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)
BEGIN TRANSACTION (Transact-SQL)
ROLLBACK TRANSACTION (Transact-SQL)