Eventos
31 mar, 23 - 2 abr, 23
Evento de aprendizaje de SQL, Fabric y Power BI más grande. 31 de marzo – 2 de abril. Use el código FABINSIDER para ahorrar $400.
Regístrate hoyEste explorador ya no se admite.
Actualice a Microsoft Edge para aprovechar las características y actualizaciones de seguridad más recientes, y disponer de soporte técnico.
Se aplica a: SQL Server
Azure SQL Database
Azure SQL Instancia administrada
Azure Synapse Analytics Analytics
Platform System (PDW)
Warehouse en Microsoft Fabric
Establece el modo BEGIN TRANSACTION en implícito para la conexión.
Convenciones de sintaxis de Transact-SQL
SET IMPLICIT_TRANSACTIONS { ON | OFF }
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;
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
Este es el conjunto de resultados.
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)
Eventos
31 mar, 23 - 2 abr, 23
Evento de aprendizaje de SQL, Fabric y Power BI más grande. 31 de marzo – 2 de abril. Use el código FABINSIDER para ahorrar $400.
Regístrate hoy