SET IMPLICIT_TRANSACTIONS (Transact-SQL)
Définit le mode de transaction implicite pour la connexion.
Syntaxe
SET IMPLICIT_TRANSACTIONS { ON | OFF }
Notes
Si sa valeur est ON, SET IMPLICIT_TRANSACTIONS met la connexion en mode de transaction implicite. Si la valeur est OFF, la connexion est remise en mode d'autovalidation.
Si une connexion est en mode de transaction implicite et qu'elle ne figure pas actuellement dans une transaction, l'exécution de l'une des instructions suivantes démarre la transaction :
ALTER TABLE |
FETCH |
REVOKE |
BEGIN TRANSACTION |
GRANT |
SELECT |
CREATE |
INSERT |
TRUNCATE TABLE |
DELETE |
OPEN |
UPDATE |
DROP |
Si la connexion figure déjà dans une transaction ouverte, les instructions ne démarrent pas de nouvelle transaction.
Si des transactions sont automatiquement ouvertes, résultant de l'activation de ce paramètre, ces dernières doivent être explicitement validées ou annulées par l'utilisateur à la fin de la transaction. Dans le cas contraire, la transaction et toutes les modifications de données qu'elle contient sont annulées lorsque l'utilisateur met fin à la connexion. Après la validation d'une transaction, l'exécution de l'une des instructions ci-dessus démarre une nouvelle transaction.
Le mode de transaction implicite reste en vigueur jusqu'à ce que la connexion exécute une instruction SET IMPLICIT_TRANSACTIONS OFF qui remet la connexion en mode d'autovalidation En mode d'autovalidation, toutes les instructions individuelles exécutées normalement sont validées.
Le fournisseur OLE DB de SQL Server Native Client pour SQL Server et le pilote ODBC de SQL Server Native Client attribuent 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 et pour les requêtes SOAP reçues via des points de terminaison HTTP.
Lorsque SET ANSI_DEFAULTS a la valeur ON, l'option SET IMPLICIT_TRANSACTIONS est activée.
La valeur de SET IMPLICIT_TRANSACTIONS est définie lors de l'exécution, et non pas durant l'analyse.
Exemples
L'exemple ci-dessous illustre des transactions démarrées explicitement et implicitement lorsque l'option IMPLICIT_TRANSACTIONS a la valeur ON. Il utilise la fonction @@TRANCOUNT pour illustrer des transactions ouvertes et fermées.
USE AdventureWorks;
GO
SET NOCOUNT ON;
GO
SET IMPLICIT_TRANSACTIONS OFF;
GO
PRINT N'Tran count at start = '
+ CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
IF OBJECT_ID(N'dbo.t1',N'U') IS NOT NULL
DROP TABLE dbo.t1;
GO
CREATE table dbo.t1 (a int);
GO
INSERT INTO dbo.t1 VALUES (1);
GO
PRINT N'Use explicit transaction.';
BEGIN TRANSACTION;
GO
INSERT INTO dbo.t1 VALUES (2);
GO
PRINT N'Tran count in explicit transaction = '
+ CAST(@@TRANCOUNT AS NVARCHAR(10));
COMMIT TRANSACTION;
GO
PRINT N'Tran count after explicit transaction = '
+ CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
PRINT N'Setting IMPLICIT_TRANSACTIONS ON.';
GO
SET IMPLICIT_TRANSACTIONS ON;
GO
PRINT N'Use implicit transactions.';
GO
-- No BEGIN TRAN needed here.
INSERT INTO dbo.t1 VALUES (4);
GO
PRINT N'Tran count in implicit transaction = '
+ CAST(@@TRANCOUNT AS NVARCHAR(10));
COMMIT TRANSACTION;
PRINT N'Tran count after implicit transaction = '
+ CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
PRINT N'Nest an explicit transaction with IMPLICIT_TRANSACTIONS ON.';
GO
PRINT N'Tran count before nested explicit transaction = '
+ CAST(@@TRANCOUNT AS NVARCHAR(10));
BEGIN TRANSACTION;
PRINT N'Tran count after nested BEGIN TRAN in implicit transaction = '
+ CAST(@@TRANCOUNT AS NVARCHAR(10));
INSERT INTO dbo.t1 VALUES (5);
COMMIT TRANSACTION;
PRINT N'Tran count after nested explicit transaction = '
+ CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
-- Commit outstanding tran.
COMMIT TRANSACTION;
GO
Voir aussi