SET IMPLICIT_TRANSACTIONS (Transact-SQL)

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Almacenamiento en Microsoft Fabric

Establece el modo BEGIN TRANSACTION en implícito para la conexión.

Convenciones de sintaxis de Transact-SQL

Sintaxis

SET IMPLICIT_TRANSACTIONS { ON | OFF }  

Nota:

Para ver la sintaxis de Transact-SQL para SQL Server 2014 (12.x) y versiones anteriores, consulte Versiones anteriores de la documentación.

Comentarios

Cuando está en ON, el sistema está en modo de transacción implícito. Esto significa que si @@TRANCOUNT = 0, cualquiera de las instrucciones de Transact-SQL siguientes inicia una transacción nueva. Es equivalente a una instrucción BEGIN TRANSACTION oculta que se ejecuta en primer lugar:

ALTER TABLE

FETCH

REVOKE

BEGIN TRANSACTION

GRANT

SELECT (vea la excepción a continuación)

CREATE

INSERT

TRUNCATE TABLE

Delete

MERGE

UPDATE

DROP

OPEN

 

Cuando está en OFF, cada una de las instrucciones T-SQL anteriores está limitada por las instrucciones ocultas BEGIN TRANSACTION y COMMIT TRANSACTION. Cuando está en OFF, decimos que el modo de transacción es de confirmación automática. Si el código de T-SQL emite visiblemente una instrucción BEGIN TRANSACTION, se dice que el modo de transacción es explícito.

Hay varios puntos esclarecedores que hay que entender:

  • Cuando el modo de transacción es implícito, no se emite ninguna instrucción BEGIN TRANSACTION oculta si @@trancount > 0. Sin embargo, las instrucciones BEGIN TRANSACTION explícitas siguen aumentando @@TRANCOUNT.

  • Cuando las instrucciones INSERT y los demás elementos de su unidad de trabajo finalicen, debe emitir instrucciones COMMIT TRANSACTION hasta que @@TRANCOUNT vuelva a disminuir hasta 0. También puede emitir una instrucción ROLLBACK TRANSACTION.

  • Las instrucciones SELECT que no seleccionan nada en una tabla no inician transacciones implícitas. Por ejemplo SELECT GETDATE(); o SELECT 1, 'ABC'; no requieren transacciones.

  • Las transacciones implícitas pueden estar en ON de forma inesperada debido a los valores predeterminados de ANSI. Par obtener más información, consulte SET ANSI_DEFAULTS (Transact-SQL).

    IMPLICIT_TRANSACTIONS ON no es habitual. En la mayoría de los casos en que IMPLICIT_TRANSACTIONS está en ON, se ha realizado la opción de SET ANSI_DEFAULTS ON.

  • El proveedor OLE DB de SQL Server Native Client para SQL Server y el controlador ODBC de SQL Server Native Client establecen automáticamente IMPLICIT_TRANSACTIONS en OFF al conectarse. El valor predeterminado de SET IMPLICIT_TRANSACTIONS es OFF para conexiones con el proveedor administrado SQLClient y para solicitudes SOAP recibidas a través de extremos HTTP.

Para ver la configuración actual de IMPLICIT_TRANSACTIONS, ejecute la consulta siguiente.

DECLARE @IMPLICIT_TRANSACTIONS VARCHAR(3) = 'OFF';  
IF ( (2 & @@OPTIONS) = 2 ) SET @IMPLICIT_TRANSACTIONS = 'ON';  
SELECT @IMPLICIT_TRANSACTIONS AS IMPLICIT_TRANSACTIONS;  

Ejemplos

El siguiente script de Transact-SQL ejecuta unos cuantos casos de prueba distintos. También se proporciona el texto de salida, que muestra el comportamiento y resultados detallados de cada caso de prueba.

-- Transact-SQL.  
-- Preparations.  
SET NOCOUNT ON;  
SET IMPLICIT_TRANSACTIONS OFF;  
GO  
WHILE (@@TranCount > 0) COMMIT TRANSACTION;  
GO  
IF (OBJECT_ID(N'dbo.t1',N'U') IS NOT NULL) DROP TABLE dbo.t1;  
GO  
CREATE table dbo.t1 (a INT);  
GO  
  
PRINT N'-------- [Test A] ---- OFF ----';  
PRINT N'[A.01] Now, SET IMPLICIT_TRANSACTIONS OFF.';  
PRINT N'[A.02] @@TranCount, at start, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));  
SET IMPLICIT_TRANSACTIONS OFF;  
GO 
INSERT INTO dbo.t1 VALUES (11);  
INSERT INTO dbo.t1 VALUES (12);  
PRINT N'[A.03] @@TranCount, after INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));  
GO  
  
PRINT N' ';  
PRINT N'-------- [Test B] ---- ON ----';  
PRINT N'[B.01] Now, SET IMPLICIT_TRANSACTIONS ON.';  
PRINT N'[B.02] @@TranCount, at start, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));  
SET IMPLICIT_TRANSACTIONS ON;  
GO
INSERT INTO dbo.t1 VALUES (21);  
INSERT INTO dbo.t1 VALUES (22);  
PRINT N'[B.03] @@TranCount, after INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));  
GO 
COMMIT TRANSACTION;  
PRINT N'[B.04] @@TranCount, after COMMIT, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));  
GO
  
PRINT N' ';  
PRINT N'-------- [Test C] ---- ON, then BEGIN TRAN ----';  
PRINT N'[C.01] Now, SET IMPLICIT_TRANSACTIONS ON.';  
PRINT N'[C.02] @@TranCount, at start, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));  
SET IMPLICIT_TRANSACTIONS ON;  
GO  
BEGIN TRANSACTION;  
INSERT INTO dbo.t1 VALUES (31);  
INSERT INTO dbo.t1 VALUES (32);  
PRINT N'[C.03] @@TranCount, after INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));  
GO  
COMMIT TRANSACTION;  
PRINT N'[C.04] @@TranCount, after a COMMIT, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));  
COMMIT TRANSACTION;  
PRINT N'[C.05] @@TranCount, after another COMMIT, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));  
GO
  
PRINT N' ';  
PRINT N'-------- [Test D] ---- ON, INSERT, BEGIN TRAN, INSERT ----';  
PRINT N'[D.01] Now, SET IMPLICIT_TRANSACTIONS ON.';  
PRINT N'[D.02] @@TranCount, at start, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));  
SET IMPLICIT_TRANSACTIONS ON;  
GO 
INSERT INTO dbo.t1 VALUES (41);  
BEGIN TRANSACTION;  
INSERT INTO dbo.t1 VALUES (42);  
PRINT N'[D.03] @@TranCount, after INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));  
GO 
COMMIT TRANSACTION;  
PRINT N'[D.04] @@TranCount, after a COMMIT, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));  
COMMIT TRANSACTION;  
PRINT N'[D.05] @@TranCount, after another COMMIT, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));  
GO
  
-- Clean up.  
SET IMPLICIT_TRANSACTIONS OFF;  
GO  
WHILE (@@TranCount > 0) COMMIT TRANSACTION;  
GO  
DROP TABLE dbo.t1;  
GO

A continuación figura la salida de texto del script de Transact-SQL anterior.

-- Text output from Transact-SQL:  
  
-------- [Test A] ---- OFF ----  
[A.01] Now, SET IMPLICIT_TRANSACTIONS OFF.  
[A.02] @@TranCount, at start, == 0  
[A.03] @@TranCount, after INSERTs, == 0  
  
-------- [Test B] ---- ON ----  
[B.01] Now, SET IMPLICIT_TRANSACTIONS ON.  
[B.02] @@TranCount, at start, == 0  
[B.03] @@TranCount, after INSERTs, == 1  
[B.04] @@TranCount, after COMMIT, == 0  
  
-------- [Test C] ---- ON, then BEGIN TRAN ----  
[C.01] Now, SET IMPLICIT_TRANSACTIONS ON.  
[C.02] @@TranCount, at start, == 0  
[C.03] @@TranCount, after INSERTs, == 2  
[C.04] @@TranCount, after a COMMIT, == 1  
[C.05] @@TranCount, after another COMMIT, == 0  
  
-------- [Test D] ---- ON, INSERT, BEGIN TRAN, INSERT ----  
[D.01] Now, SET IMPLICIT_TRANSACTIONS ON.  
[D.02] @@TranCount, at start, == 0  
[D.03] @@TranCount, after INSERTs, == 2  
[D.04] @@TranCount, after a COMMIT, == 1  
[D.05] @@TranCount, after another COMMIT, == 0  

El conjunto de resultados es el siguiente:

Consulte también

ALTER TABLE (Transact-SQL)
BEGIN TRANSACTION (Transact-SQL)
CREATE TABLE (Transact-SQL)
DELETE (Transact-SQL)
DROP TABLE (Transact-SQL)
FETCH (Transact-SQL)
GRANT (Transact-SQL)
INSERT (Transact-SQL)
MERGE (Transact-SQL)OPEN (Transact-SQL)
REVOKE (Transact-SQL)
SELECT (Transact-SQL)
Instrucciones SET (Transact-SQL)
SET ANSI_DEFAULTS (Transact-SQL)
@@TRANCOUNT (Transact-SQL)
TRUNCATE TABLE (Transact-SQL)
UPDATE (Transact-SQL)