Partager via


SET IMPLICIT_TRANSACTIONS (Transact-SQL)

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Entrepôt dans Microsoft FabricBase de données SQL dans Microsoft Fabric

Met le BEGIN TRANSACTIONmode implicite, pour la connexion.

Conventions de la syntaxe Transact-SQL

Syntaxe

SET IMPLICIT_TRANSACTIONS { ON | OFF }

Notes

Lorsque ON, le système est en mode transaction implicite . Cela signifie que si @@TRANCOUNT = 0, l’une des instructions Transact-SQL suivantes commence une nouvelle transaction. C’est l’équivalent d’un invisible BEGIN TRANSACTION exécuté en premier :

  • ALTER TABLE
  • BEGIN TRANSACTION
  • CREATE
  • DELETE
  • DROP
  • FETCH
  • GRANT
  • INSERT
  • MERGE
  • OPEN
  • REVOKE
  • SELECT (Voir remarque clarifiante)
  • TRUNCATE TABLE
  • UPDATE

Lorsque OFF, chacune des instructions T-SQL précédentes est bornée par une instruction invisible BEGIN TRANSACTION et une invisible COMMIT TRANSACTION . Lorsque OFF, on dit que le mode transaction est autocommit. Si votre code T-SQL affiche visiblement un BEGIN TRANSACTION, nous disons que le mode de transaction est explicite.

Clarifions plusieurs points :

  • Lorsque le mode transaction est implicite, aucun invisible BEGIN TRANSACTION n’est émis si @@TRANCOUNT > 0 c’est déjà le cas. Cependant, toute affirmation explicite BEGIN TRANSACTION incrémente @@TRANCOUNTtoujours .

  • Lorsque vos INSERT relevés et tout autre élément de votre unité de travail sont terminés, vous devez émettre COMMIT TRANSACTION des relevés jusqu’à ce @@TRANCOUNT que ce soit décrémenté à zéro. Ou vous pouvez en émettre un ROLLBACK TRANSACTION.

  • SELECT Les instructions qui ne sélectionnent pas dans une table ne déclenchent pas de transactions implicites. Par exemple, SELECT GETDATE(); ou SELECT 1, 'ABC'; ne nécessitent pas de transactions.

  • Les transactions implicites peuvent être ON dues de manière inattendue à des défauts ANSI. Pour plus de détails, voir SET ANSI_DEFAULTS.

    Mettre IMPLICIT_TRANSACTIONS en mode ON n’est pas populaire. Dans la plupart des cas où IMPLICIT_TRANSACTIONS est ON, c’est parce que SET ANSI_DEFAULTS ON a été défini.

  • Le fournisseur de base de données SQL Server Native Client OLE pour SQL Server, ainsi que le pilote SQL Server Native Client ODBC, sont automatiquement réglés IMPLICIT_TRANSACTIONS sur OFF lors de la connexion. Réglez IMPLICIT_TRANSACTIONS les OFF paramètres par défaut pour les connexions avec le fournisseur géré SQLClient, et pour les requêtes SOAP reçues via les terminaux HTTP.

Pour voir le paramètre actuel de IMPLICIT_TRANSACTIONS, lancez la requête suivante.

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

Exemples

Le script Transact-SQL suivant exécute plusieurs cas de test différents. La sortie texte est également fournie pour montrer en détail le comportement et les résultats de chaque cas de test.

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

Voici la sortie texte du script Transact-SQL précédent :

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