Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier les répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer de répertoire.
S’applique à :SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Entrepôt dans Microsoft Fabric
Base 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 TABLEBEGIN TRANSACTIONCREATEDELETEDROPFETCHGRANTINSERTMERGEOPENREVOKE-
SELECT(Voir remarque clarifiante) TRUNCATE TABLEUPDATE
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 TRANSACTIONn’est émis si@@TRANCOUNT > 0c’est déjà le cas. Cependant, toute affirmation expliciteBEGIN TRANSACTIONincrémente@@TRANCOUNTtoujours .Lorsque vos
INSERTrelevés et tout autre élément de votre unité de travail sont terminés, vous devez émettreCOMMIT TRANSACTIONdes relevés jusqu’à ce@@TRANCOUNTque ce soit décrémenté à zéro. Ou vous pouvez en émettre unROLLBACK TRANSACTION.
SELECTLes instructions qui ne sélectionnent pas dans une table ne déclenchent pas de transactions implicites. Par exemple,SELECT GETDATE();ouSELECT 1, 'ABC';ne nécessitent pas de transactions.Les transactions implicites peuvent être
ONdues de manière inattendue à des défauts ANSI. Pour plus de détails, voir SET ANSI_DEFAULTS.Mettre
IMPLICIT_TRANSACTIONSen modeONn’est pas populaire. Dans la plupart des cas oùIMPLICIT_TRANSACTIONSestON, c’est parce queSET ANSI_DEFAULTS ONa é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_TRANSACTIONSsurOFFlors de la connexion. RéglezIMPLICIT_TRANSACTIONSlesOFFparamè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
Contenu connexe
- MODIFIER LA TABLE (Transact-SQL)
- DÉBUT DE LA TRANSACTION (Transact-SQL)
- CRÉER TABLE (Transact-SQL)
- SUPPRIMER (Transact-SQL)
- TABLE DÉBARQUABLE (Transact-SQL)
- FETCH (Transact-SQL)
- SUBVENTION (Transact-SQL)
- INSÉRER (Transact-SQL)
- FUSION (Transact-SQL)
- OPEN (Transact-SQL)
- RROGER (Transact-SQL)
- SELECT (Transact-SQL)
- Instructions SET (Transact-SQL)
- ENSEMBLE ANSI_DEFAULTS (Transact-SQL)
- @@TRANCOUNT (Transact-SQL)
- TABLEAU TRONQUÉ (Transact-SQL)
- MISE À JOUR (Transact-SQL)