COMMIT TRANSACTION (Transact-SQL)COMMIT TRANSACTION (Transact-SQL)

SE APLICA A: síSQL Server (a partir de 2008) síAzure SQL Database síAzure SQL Data Warehouse síAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Marca el final de una transacción correcta, implícita o explícita.Marks the end of a successful implicit or explicit transaction. Si @@TRANCOUNT es 1, COMMIT TRANSACTION hace que todas las modificaciones de datos realizadas 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.If @@TRANCOUNT is 1, COMMIT TRANSACTION makes all data modifications performed since the start of the transaction a permanent part of the database, frees the resources held by the transaction, and decrements @@TRANCOUNT to 0. Si @@TRANCOUNT es mayor que 1, COMMIT TRANSACTION solo reduce @@TRANCOUNT en 1 y la transacción se mantiene activa.If @@TRANCOUNT is greater than 1, COMMIT TRANSACTION decrements @@TRANCOUNT only by 1 and the transaction stays active.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

-- Applies to SQL Server (starting with 2008) and Azure SQL Database

COMMIT [ { TRAN | TRANSACTION }  [ transaction_name | @tran_name_variable ] ] [ WITH ( DELAYED_DURABILITY = { OFF | ON } ) ]  
[ ; ]  
-- Applies to Azure SQL Data Warehouse and Parallel Data Warehouse Database

COMMIT [ TRAN | TRANSACTION ] 
[ ; ]  

ArgumentosArguments

transaction_nametransaction_name
SE APLICA A: SQL Server y Azure SQL DatabaseAPPLIES TO: SQL Server and Azure SQL Database

Motor de base de datos de SQL ServerSQL Server Database Engine lo omite.Is ignored by the Motor de base de datos de SQL ServerSQL Server Database Engine. transaction_name especifica un nombre de transacción asignado por una instrucción BEGIN TRANSACTION anterior.transaction_name specifies a transaction name assigned by a previous BEGIN TRANSACTION. transaction_name debe cumplir con las reglas para identificadores, pero no puede superar los 32 caracteres.transaction_namemust conform to the rules for identifiers, but cannot exceed 32 characters. 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.transaction_name can be used as a readability aid by indicating to programmers which nested BEGIN TRANSACTION the COMMIT TRANSACTION is associated with.

@tran_name_variable
SE APLICA A: SQL Server y Azure SQL DatabaseAPPLIES TO: SQL Server and Azure SQL Database

Se trata del nombre de una variable definida por el usuario que contiene un nombre de transacción válido.Is the name of a user-defined variable containing a valid transaction name. La variable se debe declarar con un tipo de datos char, varchar, nchar o nvarchar.The variable must be declared with a char, varchar, nchar, or nvarchar data type. 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.If more than 32 characters are passed to the variable, only 32 characters will be used; the remaining characters are truncated.

DELAYED_DURABILITYDELAYED_DURABILITY
SE APLICA A: SQL Server y Azure SQL DatabaseAPPLIES TO: SQL Server and Azure SQL Database

La opción que solicita esta transacción se confirma con la durabilidad diferida.Option that requests this transaction be committed with delayed durability. Se omitirá la solicitud si la base de datos se ha modificado con DELAYED_DURABILITY = DISABLED o DELAYED_DURABILITY = FORCED.The request is ignored if the database has been altered with DELAYED_DURABILITY = DISABLED or DELAYED_DURABILITY = FORCED. Vea el tema Control de la durabilidad de las transacciones para más obtener información.See the topic Control Transaction Durability for more information.

NotasRemarks

Es responsabilidad del programador de Transact-SQLTransact-SQL utilizar COMMIT TRANSACTION solo en el punto donde todos los datos a los que hace referencia la transacción sean lógicamente correctos.It is the responsibility of the Transact-SQLTransact-SQL programmer to issue COMMIT TRANSACTION only at a point when all data referenced by the transaction is logically correct.

Si la transacción que se ha confirmado era una transacción Transact-SQLTransact-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.If the transaction committed was a Transact-SQLTransact-SQL distributed transaction, COMMIT TRANSACTION triggers MS DTC to use a two-phase commit protocol to commit all of the servers involved in the transaction. Si una transacción local afecta a dos o más bases de datos de la misma instancia del Motor de base de datosDatabase Engine, la instancia utiliza una confirmación interna en dos fases para confirmar todas las bases de datos involucradas en la transacción.If a local transaction spans two or more databases on the same instance of the Motor de base de datosDatabase Engine, the instance uses an internal two-phase commit to commit all of the databases involved in the transaction.

Cuando se utiliza en transacciones anidadas, las confirmaciones de las transacciones anidadas no liberan recursos ni hacen permanentes sus modificaciones.When used in nested transactions, commits of the inner transactions do not free resources or make their modifications permanent. Las modificaciones sobre los datos solo quedan permanentes y se liberan los recursos cuando se confirma la transacción más externa.The data modifications are made permanent and resources freed only when the outer transaction is committed. Cada COMMIT TRANSACTION que se ejecute cuando @@TRANCOUNT sea mayor que 1 solo reduce @@TRANCOUNT en 1.Each COMMIT TRANSACTION issued when @@TRANCOUNT is greater than 1 simply decrements @@TRANCOUNT by 1. Cuando @@TRANCOUNT llega a 0, se confirma la transacción externa completa.When @@TRANCOUNT is finally decremented to 0, the entire outer transaction is committed. Como Motor de base de datosDatabase Engine ignora 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.Because transaction_name is ignored by the Motor de base de datosDatabase Engine, issuing a COMMIT TRANSACTION referencing the name of an outer transaction when there are outstanding inner transactions only decrements @@TRANCOUNT by 1.

La ejecución de COMMIT TRANSACTION cuando @@TRANCOUNT es 0 produce un error; no hay ninguna instrucción BEGIN TRANSACTION asociada.Issuing a COMMIT TRANSACTION when @@TRANCOUNT is 0 results in an error; there is no corresponding BEGIN TRANSACTION.

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.You cannot roll back a transaction after a COMMIT TRANSACTION statement is issued because the data modifications have been made a permanent part of the database.

El Motor de base de datosDatabase Engine incrementa el recuento de transacciones de una instrucción solo cuando el recuento de transacciones es 0 al inicio de la instrucción.The Motor de base de datosDatabase Engine increments the transaction count within a statement only when the transaction count is 0 at the start of the statement.

PermisosPermissions

Debe pertenecer al rol public .Requires membership in the public role.

EjemplosExamples

A.A. Confirmación de una transacciónCommitting a transaction

SE APLICA A: SQL Server, Azure SQL Database, Azure SQL Data Warehouse y Almacenamiento de datos paralelosAPPLIES TO: SQL Server, Azure SQL Database, Azure SQL Data Warehouse, and Parallel Data Warehouse

En el siguiente ejemplo se elimina a un candidato a un puesto de trabajo.The following example deletes a job candidate. Usa AdventureWorks.It uses AdventureWorks.

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

B.B. Confirmar una transacción anidadaCommitting a nested transaction

SE APLICA A: SQL Server y Azure SQL DatabaseAPPLIES TO: SQL Server and 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.The following example creates a table, generates three levels of nested transactions, and then commits the nested transaction. 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.Although each COMMIT TRANSACTION statement has a transaction_name parameter, there is no relationship between the COMMIT TRANSACTION and BEGIN TRANSACTION statements. Los parámetros transaction_name solo son ayudas de legibilidad 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.The transaction_name parameters are simply readability aids to help the programmer ensure that the proper number of commits are coded to decrement @@TRANCOUNT to 0 and thereby commit the outer transaction.

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

Ver tambiénSee Also

BEGIN DISTRIBUTED TRANSACTION (Transact-SQL) BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)
BEGIN TRANSACTION (Transact-SQL) BEGIN TRANSACTION (Transact-SQL)
COMMIT WORK (Transact-SQL) COMMIT WORK (Transact-SQL)
ROLLBACK TRANSACTION (Transact-SQL) ROLLBACK TRANSACTION (Transact-SQL)
ROLLBACK WORK (Transact-SQL) ROLLBACK WORK (Transact-SQL)
SAVE TRANSACTION (Transact-SQL) SAVE TRANSACTION (Transact-SQL)
@@TRANCOUNT (Transact-SQL)@@TRANCOUNT (Transact-SQL)