Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Se aplica a:SQL Server
Azure SQL Database
Instancia
administrada de Azure SQLAzure Synapse Analytics
Analytics Platform System (PDW)
Almacenamiento en Microsoft Fabric
Base 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 TABLEBEGIN TRANSACTIONCREATEDELETEDROPFETCHGRANTINSERTMERGEOPENREVOKE-
SELECT(Véase la observación aclaratoria) TRUNCATE TABLEUPDATE
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 TRANSACTIONsi@@TRANCOUNT > 0ya lo ha hecho. Sin embargo, cualquier afirmación explícitaBEGIN TRANSACTIONsigue incrementando@@TRANCOUNT.Cuando tus
INSERTestados de cuenta y cualquier otra cosa de tu unidad de trabajo estén terminados, debes emitirCOMMIT TRANSACTIONestados hasta que@@TRANCOUNTse reduzca a 0. O puedes emitir unoROLLBACK TRANSACTION.
SELECTLas sentencias que no seleccionan de una tabla no inician transacciones implícitas. Por ejemplo,SELECT GETDATE();oSELECT 1, 'ABC';no requieren transacciones.Las transacciones implícitas podrían deberse
ONinesperadamente a impagos ANSI. Para más detalles, véase SET ANSI_DEFAULTS.Poner
IMPLICIT_TRANSACTIONSenONmodo no es popular. En la mayoría de los casos dondeIMPLICIT_TRANSACTIONSesON, es porqueSET ANSI_DEFAULTS ONfue 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_TRANSACTIONSautomáticamente enOFFal conectarse. EstableceIMPLICIT_TRANSACTIONSlos valores predeterminados paraOFFconexiones 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
Contenido relacionado
- MODIFICAR TABLA (Transact-SQL)
- INICIAR LA TRANSACCIÓN (Transact-SQL)
- CREAR TABLA (Transact-SQL)
- ELIMINAR (Transact-SQL)
- MESA DE CAÍDA (Transact-SQL)
- BUSCAR (Transact-SQL)
- BECA (Transact-SQL)
- INSERTAR (Transact-SQL)
- FUSIÓN (Transact-SQL)
- ABRIR (Transact-SQL)
- REVOCAR (Transact-SQL)
- SELECT (Transact-SQL)
- Instrucciones SET (Transact-SQL)
- SET ANSI_DEFAULTS (Transact-SQL)
- @@TRANCOUNT (Transact-SQL)
- TABLA TRUNCADA (Transact-SQL)
- ACTUALIZACIÓN (Transact-SQL)