Compartilhar via


SET IMPLICIT_TRANSACTIONS (Transact-SQL)

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

Ícone de vínculo de tópico Convenções da 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. As transações implícitas podem ocorrer de maneira inesperada devido a padrões ANSI. Quando IMPLICIT_TRANSACTIONS = ON, uma instrução BEGIN TRANSACTION implícita iniciará duas transações aninhadas.

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 (Consulte exceção abaixo.)

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 execução de uma instrução BEGIN TRANSACTION quando SET IMPLICIT_TRANSACTIONS está definida como ON faz com que duas transações aninhadas sejam abertas. BEGIN TRANSACTION incrementa @@TRANCOUNT sempre que uma transação está ativa.

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.

As instruções SELECT que não selecionam de uma tabela não iniciam transações implícitas. Por exemplo, SELECT GETDATE(); ou SELECT 1, 'ABC'; não exigem transações.

Para exibir a configuração atual de IMPLICIT_TRANSACTIONS, execute a consulta a seguir.

DECLARE @IMPLICIT_TRANSACTIONS VARCHAR(3) = 'OFF';
IF ( (2 & @@OPTIONS) = 2 ) SET @IMPLICIT_TRANSACTIONS = 'ON';
SELECT @IMPLICIT_TRANSACTIONS AS IMPLICIT_TRANSACTIONS;

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.

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

Aqui está o conjunto de resultados.

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

Consulte também

Referência

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)

Instruções SET (Transact-SQL)

SET ANSI_DEFAULTS (Transact-SQL)

@@TRANCOUNT (Transact-SQL)

TRUNCATE TABLE (Transact-SQL)

UPDATE (Transact-SQL)