SET IMPLICIT_TRANSACTIONS (Transact-SQL)

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

Définit le mode BEGIN TRANSACTION de la connexion sur implicite.

Conventions de la syntaxe Transact-SQL

Syntaxe

SET IMPLICIT_TRANSACTIONS { ON | OFF }  

Remarque

Pour afficher la syntaxe Transact-SQL pour SQL Server 2014 (12.x) et versions antérieures, consultez la Documentation sur les versions antérieures.

Notes

Avec la valeur ON, le système est en mode de transaction implicite. Cela signifie que si @@TRANCOUNT = 0, l’utilisation d’une des instructions Transact-SQL suivantes commence une nouvelle transaction. Cela équivaut à exécuter en premier une instruction BEGIN TRANSACTION invisible :

ALTER TABLE

FETCH

REVOKE

BEGIN TRANSACTION

GRANT

SELECT (Voir l'exception ci-dessous.)

CREATE

INSERT

TRUNCATE TABLE

Suppression

MERGE

UPDATE

DROP

OPEN

 

Quand la valeur est définie à OFF, chacune des instructions T-SQL ci-dessus est délimitée par une instruction BEGIN TRANSACTION invisible et une instruction COMMIT TRANSACTION invisible. Avec la valeur OFF, le mode de transaction est en validation automatique. Si votre code T-SQL exécute une instruction BEGIN TRANSACTION de manière visible, le mode de transaction est explicite.

Clarifions plusieurs points :

  • Quand le mode de transaction est implicite, aucune instruction BEGIN TRANSACTION invisible n’est exécutée si @@trancount est déjà > 0. Toutefois, toutes les instructions BEGIN TRANSACTION explicites continuent d’incrémenter @@TRANCOUNT.

  • Quand vous avez terminé les instructions INSERT et autres éléments dans votre unité de travail, vous devez exécuter des instructions COMMIT TRANSACTION jusqu’à ce que @@TRANCOUNT revienne à 0. Sinon, vous pouvez aussi exécuter une instruction ROLLBACK TRANSACTION.

  • Les instructions SELECT qui ne réalisent pas de sélection à partir d'une table ne démarrent pas de transactions implicites. Par exemple, SELECT GETDATE(); ou SELECT 1, 'ABC'; ne requièrent pas de transactions.

  • Les transactions implicites peuvent être définies sur ON de façon inattendue en raison des valeurs ANSI par défaut. Pour plus d’informations, consultez SET ANSI_DEFAULTS (Transact-SQL).

    IMPLICIT_TRANSACTIONS n’a pas souvent la valeur ON. Dans la plupart des cas où IMPLICIT_TRANSACTIONS a la valeur ON, cela est dû au fait que l’option SET ANSI_DEFAULTS a été explicitement définie à ON.

  • Le fournisseur OLE DB de SQL Server Native Client pour SQL Server et le pilote ODBC de SQL Server Native Client affectent automatiquement la valeur OFF à IMPLICIT_TRANSACTIONS lors de la connexion. SET IMPLICIT_TRANSACTIONS prend la valeur par défaut OFF pour les connexions avec le fournisseur managé SQLClient ainsi que pour les requêtes SOAP reçues par le biais des points de terminaison HTTP.

Pour afficher la valeur actuelle de IMPLICIT_TRANSACTIONS, exécutez la requête suivante :

DECLARE @IMPLICIT_TRANSACTIONS 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.

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

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

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

Voici le jeu de résultats obtenu.

Voir aussi

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)
Instructions SET (Transact-SQL)
SET ANSI_DEFAULTS (Transact-SQL)
@@TRANCOUNT (Transact-SQL)
TRUNCATE TABLE (Transact-SQL)
UPDATE (Transact-SQL)