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 sólo reduce @@TRANCOUNT en 1 y la transacción sigue activa.

Icono de vínculo a temasConvenciones de sintaxis de Transact-SQL

Sintaxis

COMMIT { TRAN | TRANSACTION } [ transaction_name | @tran_name_variable ] ]
[ ; ]

Argumentos

  • transaction_name
    Omitido por SQL Server Database Engine (Motor de base de datos de SQL Server). transaction_name especifica un nombre de transacción asignado a una instrucción BEGIN TRANSACTION anterior. transaction_namedebe 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, sólo se usarán 32 caracteres; el resto de los caracteres se truncarán.

Notas

Es responsabilidad del programador de Transact-SQL utilizar COMMIT TRANSACTION sólo 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 Database Engine (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 sólo 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 sólo reduce @@TRANCOUNT en 1. Cuando @@TRANCOUNT llega a 0, se confirma la transacción externa entera. Como Database Engine (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 sólo 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 Database Engine (Motor de base de datos) en SQL Server 2000 y versiones posteriores incrementa el recuento de transacciones de una instrucción sólo cuando el recuento de transacciones es 0 al inicio de la instrucción. En SQL Server versión 7.0, el recuento de transacciones siempre aumenta, independientemente del recuento al inicio de la instrucción. Esto puede hacer que el valor devuelto por @@TRANCOUNT en los desencadenadores sea más bajo en SQL Server 2000 y versiones posteriores de lo que lo es en SQL Server versión 7.0.

En SQL Server 2000 y versiones posteriores, si una instrucción COMMIT TRANSACTION o COMMIT WORK se ejecuta en un desencadenador y no hay una instrucción BEGIN TRANSACTION explícita o implícita correspondiente al inicio del desencadenador, los usuarios pueden ver comportamientos distintos a los de SQL Server versión 7.0. No se recomienda la colocación de instrucciones COMMIT TRANSACTION o COMMIT WORK en un desencadenador.

Permisos

Debe pertenecer a la función public.

Ejemplos

A. Confirmar una transacción.

En este ejemplo se elimina el candidato de un trabajo.

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

B. Confirmar una transacción anidada.

Este ejemplo crea una tabla, genera tres niveles de transacciones anidadas y después confirma la transacción anidada. Aunque la instrucción COMMIT TRANSACTION tiene el parámetro transaction_name, no hay ninguna relación entre las instrucciones COMMIT TRANSACTION y BEGIN TRANSACTION. Los parámetros transaction_name sólo 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 AdventureWorks;
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