Compartir a través de


SET IMPLICIT_TRANSACTIONS (Transact-SQL)

Se aplica a:SQL ServerAzure SQL DatabaseInstancia administrada de Azure SQLAzure Synapse AnalyticsAnalytics Platform System (PDW)Almacenamiento en Microsoft FabricBase de datos SQL en Microsoft Fabric

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

Convenciones de sintaxis de Transact-SQL

Sintaxis

SET IMPLICIT_TRANSACTIONS { ON | OFF }

Comentarios

Cuando ON, el sistema está en modo de transacción implícita . Esto significa que si @@TRANCOUNT = 0, cualquiera de las siguientes Transact-SQL sentencias inicia una nueva transacción. Es equivalente a que un invisible BEGIN TRANSACTION sea ejecutado primero:

  • ALTER TABLE
  • BEGIN TRANSACTION
  • CREATE
  • DELETE
  • DROP
  • FETCH
  • GRANT
  • INSERT
  • MERGE
  • OPEN
  • REVOKE
  • SELECT (Véase la observación aclaratoria)
  • TRUNCATE TABLE
  • UPDATE

Cuando OFF, cada una de las sentencias T-SQL anteriores está acotada por una sentencia no vista BEGIN TRANSACTION y otra no vista COMMIT TRANSACTION . Cuando OFF, decimos que el modo de transacción es autocommit. Si tu código T-SQL emite visiblemente un BEGIN TRANSACTION, decimos 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 ningún invisible BEGIN TRANSACTION si @@TRANCOUNT > 0 ya lo ha hecho. Sin embargo, cualquier afirmación explícita BEGIN TRANSACTION sigue incrementando @@TRANCOUNT.

  • Cuando tus INSERT estados de cuenta y cualquier otra cosa de tu unidad de trabajo estén terminados, debes emitir COMMIT TRANSACTION estados hasta que @@TRANCOUNT se reduzca a 0. O puedes emitir uno ROLLBACK TRANSACTION.

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

  • Las transacciones implícitas podrían deberse ON inesperadamente a impagos ANSI. Para más detalles, véase SET ANSI_DEFAULTS.

    Poner IMPLICIT_TRANSACTIONS en ON modo no es popular. En la mayoría de los casos donde IMPLICIT_TRANSACTIONS es ON, es porque SET ANSI_DEFAULTS ON fue establecido.

  • El proveedor de SQL Server Native Client OLE DB para SQL Server y el controlador ODBC del SQL Server Native Client se establecen IMPLICIT_TRANSACTIONS automáticamente en OFF al conectarse. Establece IMPLICIT_TRANSACTIONS los valores predeterminados para OFF conexiones con el proveedor gestionado SQLClient y para las solicitudes SOAP recibidas a través de endpoints HTTP.

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

DECLARE @IMPLICIT_TRANSACTIONS AS 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.

-- 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.

-------- [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