Partilhar via


CONJUNTO IMPLICIT_TRANSACTIONS (Transact-SQL)

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSistema de Plataforma de Análise (PDW)Armazém no Microsoft FabricBase de dados SQL no Microsoft Fabric

Define o BEGIN TRANSACTION modo como implícito, para a ligação.

Transact-SQL convenções de sintaxe

Sintaxe

SET IMPLICIT_TRANSACTIONS { ON | OFF }

Observações

Quando ON, o sistema está em modo de transação implícita . Isto significa que se @@TRANCOUNT = 0, qualquer uma das seguintes instruções Transact-SQL inicia uma nova transação. É equivalente a um invisible BEGIN TRANSACTION ser executado primeiro:

  • ALTER TABLE
  • BEGIN TRANSACTION
  • CREATE
  • DELETE
  • DROP
  • FETCH
  • GRANT
  • INSERT
  • MERGE
  • OPEN
  • REVOKE
  • SELECT (Ver observação esclarecedora)
  • TRUNCATE TABLE
  • UPDATE

Quando OFF, cada uma das instruções T-SQL anteriores é limitada por uma instrução invisível BEGIN TRANSACTION e uma não vista COMMIT TRANSACTION . Quando OFF, dizemos que o modo de transação é autocommit. Se o seu código T-SQL emitir visivelmente um BEGIN TRANSACTION, dizemos que o modo de transação é explícito.

Existem vários pontos clarificadores a compreender:

  • Quando o modo de transação é implícito, não é emitido nenhum invisível BEGIN TRANSACTION , se @@TRANCOUNT > 0 já for. No entanto, quaisquer afirmações explícitas BEGIN TRANSACTION ainda incrementam @@TRANCOUNT.

  • Quando os seus INSERT extratos e qualquer outra coisa da sua unidade de trabalho estiverem concluídos, deve emitir COMMIT TRANSACTION extratos até @@TRANCOUNT que seja decrementado novamente para 0. Ou pode emitir um.ROLLBACK TRANSACTION

  • SELECT Instruções 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.

  • Transações implícitas podem, de forma inesperada, dever-se ON a incumprimentos ANSI. Para mais detalhes, veja SET ANSI_DEFAULTS.

    Definir IMPLICIT_TRANSACTIONS para ON não é popular. Na maioria dos casos em que IMPLICIT_TRANSACTIONS é ON, é porque SET ANSI_DEFAULTS ON foi definido.

  • O SQL Server Native Client OLE DB Provider para SQL Server, e o driver SQL Server Native Client ODBC, são automaticamente definidos IMPLICIT_TRANSACTIONS como OFF ao ligar-se. Defina IMPLICIT_TRANSACTIONS os padrões para OFF ligações com o fornecedor gerido SQLClient e para pedidos SOAP recebidos através de endpoints HTTP.

Para visualizar a definição atual para IMPLICIT_TRANSACTIONS, execute a seguinte consulta.

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

Examples

O script de Transact-SQL seguinte executa alguns casos de teste diferentes. Também é fornecido o texto de saída, que mostra o comportamento detalhado e os resultados de cada caso de teste.

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