SET IMPLICIT_TRANSACTIONS (Transact-SQL)

 

ESTE TEMA SE APLICA A: síSQL Server (a partir de 2008)síBase de datos SQL de AzuresíAlmacenamiento de datos SQL de Azure síAlmacenamiento de datos paralelos

Establece el modo de BEGIN TRANSACTION en implícita, para la conexión.

Topic link icon Convenciones de sintaxis de Transact-SQL

-- Syntax for SQL Server, Azure SQL Database, Azure SQL Data Warehouse, Parallel Data Warehouse  
  
SET IMPLICIT_TRANSACTIONS { ON | OFF }  

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

ALTER TABLEFETCHREVOKE
BEGIN TRANSACTIONGRANTSELECT (vea la excepción a continuación)
CREATEINSERTTRUNCATE TABLE
DELETEOPENUPDATE
DROP..

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

Hay varios puntos defecación comprender:

  • Cuando el modo de transacción es implícita, ningún no visto BEGIN TRANSACTION se emite si @@trancount > 0 ya. Sin embargo, las instrucciones BEGIN TRANSACTION explícitas todavía incremento @@TRANCOUNT.

  • Cuando haya finalizado las instrucciones INSERT y cualquier otra cosa en la unidad de trabajo, debe emitir instrucciones COMMIT TRANSACTION hasta @@TRANCOUNT disminuye hasta 0. O bien, 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.

  • Transacciones implícitas pueden ser inesperadamente ON debido a los valores predeterminados ANSI. Para obtener más información, consulte SET ANSI_DEFAULTS ( Transact-SQL ).

    IMPLICIT_TRANSACTIONS ON no es conocido. En la mayoría de los casos donde IMPLICIT_TRANSACTIONS es ON, es porque se ha realizado la opción de SET ANSI_DEFAULTS ON.

  • El SQL Server proveedor Native Client OLE DB para SQL Server, y el SQL Server controlador ODBC de Native Client, establecen automáticamente IMPLICIT_TRANSACTIONS en OFF al conectarse. SET IMPLICIT_TRANSACTIONS tiene como valor predeterminado OFF para las 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;  

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

-- Transact-SQL.  
go  
-- 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 INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));  
COMMIT TRANSACTION;  
PRINT N'[D.05] @@TranCount, after INSERTs, == ' + 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 de la secuencia de comandos 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 INSERTs, == 1  
[D.05] @@TranCount, after INSERTs, == 0  

El conjunto de resultados es el siguiente.

ALTER TABLE ( Transact-SQL )
COMENZAR la TRANSACCIÓN ( Transact-SQL )
CREAR TABLA ( Transact-SQL )
ELIMINAR ( Transact-SQL )
ELIMINAR TABLA ( Transact-SQL )
FETCH ( Transact-SQL )
GRANT ( Transact-SQL )
INSERT ( Transact-SQL )
ABRIR ( Transact-SQL )
REVOKE ( Transact-SQL )
SELECCIONE ( Transact-SQL )
Instrucciones SET ( Transact-SQL )
SET ANSI_DEFAULTS ( Transact-SQL )
@@TRANCOUNT ( Transact-SQL )
TRUNCATE TABLE ( Transact-SQL )
ACTUALIZACIÓN ( Transact-SQL )

Adiciones de comunidad

AGREGAR
Mostrar: