Compartilhar via


SET IMPLICIT_TRANSACTIONS (Transact-SQL)

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics Warehouse do PDW (Analytics Platform System) no Microsoft Fabric

Define o modo de BEGIN TRANSACTION como implicit para a conexão.

Convenções de sintaxe de Transact-SQL

Sintaxe

SET IMPLICIT_TRANSACTIONS { ON | OFF }  

Comentários

Quando ativado, o sistema está no modo de transação implicit. Isso significa que, se @@TRANCOUNT = 0, qualquer uma das seguintes instruções Transact-SQL iniciará uma nova transação. É equivalente a uma BEGIN TRANSACTION não vista ser executada primeiro:

ALTER TABLE

FETCH

REVOKE

BEGIN TRANSACTION

GRANT

SELECT (Consulte exceção abaixo.)

CREATE

INSERT

TRUNCATE TABLE

Delete (excluir)

MESCLAR

UPDATE

DROP

OPEN

 

Quando OFF, cada uma das instruções T-SQL anteriores é delimitada por instruções BEGIN TRANSACTION e COMMIT TRANSACTION não vistas. Quando OFF, dizemos que o modo de transação é autocommit. Se seu código T-SQL visivelmente emite um BEGIN TRANSACTION, dizemos que é o modo de transação explicit.

Há vários pontos esclarecedores para entender:

  • Quando o modo de transação é implícito, nenhuma BEGIN TRANSACTION não vista será emitido se @@trancount > 0. No entanto, qualquer instrução BEGIN TRANSACTION explícita ainda incrementará @@TRANCOUNT.

  • Quando as instruções INSERT e qualquer outro elemento em sua unidade de trabalho for concluído, emita instruções COMMIT TRANSACTION até @@TRANCOUNT ser reduzido de volta a 0. Ou você pode emitir uma ROLLBACK TRANSACTION.

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

  • As transações implícitas podem ficar ON inesperadamente devido a padrões ANSI. Para obter detalhes, confira SET ANSI_DEFAULTS (Transact-SQL).

    IMPLICIT_TRANSACTIONS ON não é popular. Na maioria dos casos em que IMPLICIT_TRANSACTIONS está ON, é porque a escolha SET ANSI_DEFAULTS ON foi feita.

  • O Provedor OLE DB do SQL Server Native Client e o driver ODBC do SQL Server Native Client definem automaticamente IMPLICIT_TRANSACTIONS como OFF durante o processo de conexão. SET IMPLICIT_TRANSACTIONS usa OFF como padrão para conexões com o provedor gerenciado SQLClient e para solicitações SOAP recebidas por meio de pontos de extremidade HTTP.

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 script Transact-SQL a seguir é executado em alguns casos de teste diferentes. A saída de texto também é fornecida, mostrando o comportamento detalhado e os resultados de cada caso de teste.

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

Next é a saída de texto do script 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  

Veja a seguir o conjunto de resultados.

Confira também

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)
Instruções SET (Transact-SQL)
SET ANSI_DEFAULTS (Transact-SQL)
@@TRANCOUNT (Transact-SQL)
TRUNCATE TABLE (Transact-SQL)
UPDATE (Transact-SQL)