SET IMPLICIT_TRANSACTIONS (Transact-SQL)

Establece el modo de transacción implícita para la conexión.

Icono de vínculo a temas Convenciones de sintaxis de Transact-SQL

Sintaxis

SET IMPLICIT_TRANSACTIONS { ON | OFF }

Comentarios

Cuando es ON, SET IMPLICIT_TRANSACTIONS establece la conexión al modo de transacción implícita. Cuando es OFF, restablece la conexión al modo de transacción con confirmación automática. Las transacciones implícitas pueden activarse de forma inesperada debido a los valores predeterminados de ANSI. Cuando IMPLICIT_TRANSACTIONS = ON, una instrucción BEGIN TRANSACTION explícita iniciará dos transacciones anidadas.

Cuando una conexión está en modo de transacción implícita y actualmente no está realizando una transacción, la ejecución de cualquiera de las instrucciones siguientes inicia una transacción:

ALTER TABLE

FETCH

REVOKE

BEGIN TRANSACTION

GRANT

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

CREATE

INSERT

TRUNCATE TABLE

DELETE

OPEN

UPDATE

DROP

Si la conexión tiene ya una transacción abierta, estas instrucciones no inician una nueva transacción.

Al término de las transacciones que se abran automáticamente por ser esta opción ON, el usuario debe confirmarlas o revertirlas explícitamente. En caso contrario, las transacciones y todos los cambios que se realicen en los datos se revertirán cuando el usuario se desconecte. Una vez confirmada una transacción, la ejecución de alguna de las instrucciones anteriores iniciará una transacción nueva.

El modo de transacción implícita permanecerá activo hasta que la conexión ejecute una instrucción SET IMPLICIT_TRANSACTIONS OFF, que restablece el modo de confirmación automática en la conexión. En el modo de confirmación automática, todas las instrucciones individuales se confirman cuando finalizan correctamente.

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. SET IMPLICIT_TRANSACTIONS tiene el valor predeterminado OFF para conexiones con el proveedor administrado SQLClient y para solicitudes SOAP recibidas a través de extremos HTTP.

Cuando SET ANSI_DEFAULTS está establecido en ON, SET IMPLICIT_TRANSACTIONS también se establece en ON.

Si se ejecuta una instrucción BEGIN TRANSACTION cuando SET IMPLICIT_TRANSACTIONS está configurado en ON, se abrirán dos transacciones anidadas. BEGIN_TRANSACTION incrementa @@trancount siempre que hay una transacción activa.

La opción SET IMPLICIT_TRANSACTIONS se establece en tiempo de ejecución, no en tiempo de análisis.

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.

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 ejemplo siguiente muestra transacciones que se inician explícita e implícitamente con IMPLICIT_TRANSACTIONS establecido en ON. Utiliza la función @@TRANCOUNT para mostrar transacciones abiertas y cerradas.

SET NOCOUNT ON;
GO
SET IMPLICIT_TRANSACTIONS OFF;
GO
PRINT N'Tran count at start = '
    + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
IF OBJECT_ID(N'dbo.t1',N'U') IS NOT NULL
    DROP TABLE dbo.t1;
GO
CREATE table dbo.t1 (a int);
GO
INSERT INTO dbo.t1 VALUES (1);
GO
PRINT N'Use explicit transaction.';
BEGIN TRANSACTION;
GO
INSERT INTO dbo.t1 VALUES (2);
GO
PRINT N'Tran count in explicit transaction = '
    + CAST(@@TRANCOUNT AS NVARCHAR(10));
COMMIT TRANSACTION;
GO
PRINT N'Tran count after explicit transaction = '
    + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO

PRINT N'Setting IMPLICIT_TRANSACTIONS ON.';
GO
SET IMPLICIT_TRANSACTIONS ON;
GO

PRINT N'Use implicit transactions.';
GO
-- No BEGIN TRAN needed here.
INSERT INTO dbo.t1 VALUES (4);
GO
PRINT N'Tran count in implicit transaction = '
    + CAST(@@TRANCOUNT AS NVARCHAR(10));
COMMIT TRANSACTION;
PRINT N'Tran count after implicit transaction = '
    + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO

PRINT N'Nest an explicit transaction with IMPLICIT_TRANSACTIONS ON.';
GO
PRINT N'Tran count before nested explicit transaction = '
    + CAST(@@TRANCOUNT AS NVARCHAR(10));

BEGIN TRANSACTION;
PRINT N'Tran count after nested BEGIN TRAN in implicit transaction = '
    + CAST(@@TRANCOUNT AS NVARCHAR(10));
INSERT INTO dbo.t1 VALUES (5);
COMMIT TRANSACTION;
PRINT N'Tran count after nested explicit transaction = '
    + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
-- Commit outstanding transaction.
COMMIT TRANSACTION;
GO

El conjunto de resultados es el siguiente.

Tran count at start = 2
Use explicit transaction.
Tran count in explicit transaction = 3
Tran count after explicit transaction = 2
Setting IMPLICIT_TRANSACTIONS ON.
Use implicit transactions.
Tran count in implicit transaction = 2
Tran count after implicit transaction = 1
Nest an explicit transaction with IMPLICIT_TRANSACTIONS ON.
Tran count before nested explicit transaction = 1
Tran count after nested BEGIN TRAN in implicit transaction = 2
Tran count after nested explicit transaction = 1

Vea también

Referencia

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)

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)