SET IMPLICIT_TRANSACTIONS (Transact-SQL)

Define o modo de transação implícita para a conexão.

Ícone de vínculo de tópicoConvenções de sintaxe Transact-SQL

Sintaxe

SET IMPLICIT_TRANSACTIONS { ON | OFF }

Comentários

Quando ON, SET IMPLICIT_TRANSACTIONS define a conexão em modo de transação implícita. Quando OFF, retorna a conexão para o modo de transação de autoconfirmação.

Quando uma conexão está em modo de transação implícita e a conexão não está em uma transação no momento, a execução de qualquer uma das seguintes instruções inicia uma transação:

ALTER TABLE

FETCH

REVOKE

BEGIN TRANSACTION

GRANT

SELECT

CREATE

INSERT

TRUNCATE TABLE

DELETE

OPEN

UPDATE

DROP

Se a conexão já estiver em uma transação aberta, as instruções não iniciarão uma nova transação.

As transações abertas automaticamente como resultado dessa configuração estar ON devem ser confirmadas ou revertidas explicitamente pelo usuário ao término da transação. Caso contrário, a transação e todas as alterações de dados que ela contém serão revertidas quando o usuário se desconectar. Depois que a transação já está confirmada, a execução de uma das instruções anteriores inicia uma nova transação.

O modo de transação implícita permanece em vigor até que a conexão execute uma instrução SET IMPLICIT_TRANSACTIONS OFF, que retorna a conexão para o modo de confirmação automática. No modo de confirmação automática, todas as instruções individuais serão confirmadas se forem concluídas com êxito.

O driver SQL Server Native Client OLE DB Provider do SQL Server e o driver SQL Server Native Client ODBC definem automaticamente IMPLICIT_TRANSACTIONS como OFF quando estão conectados. SET IMPLICIT_TRANSACTIONS é padronizada como OFF para conexões com o provedor gerenciado SQLClient e para solicitações SOAP recebidas por meio de pontos de extremidade HTTP.

Quando SET ANSI_DEFAULTS está ON, SET IMPLICIT_TRANSACTIONS está ON.

A configuração de SET IMPLICIT_TRANSACTIONS é definida durante a execução ou tempo de execução, e não no momento da análise.

Exemplos

O exemplo a seguir demonstra transações que são iniciadas explícita e implicitamente com IMPLICIT_TRANSACTIONS definido como ON. Ele usa função @@TRANCOUNT para demonstrar transações abertas e fechadas.

USE AdventureWorks;
GO
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 tran.
COMMIT TRANSACTION;
GO