SET IMPLICIT_TRANSACTIONS (Transact-SQL)

Définit le mode de transaction implicite pour la connexion.

Icône Lien de rubrique Conventions de syntaxe Transact-SQL

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 de validation automatique. Les transactions implicites peuvent être activées de façon inattendue en raison des valeurs ANSI par défaut. Si IMPLICIT_TRANSACTIONS = ON, une instruction BEGIN TRANSACTION explicite démarre deux transactions imbriquées.

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 (Voir l'exception ci-dessous.)

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 de validation automatique. En mode de validation automatique, 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.

L'exécution d'une instruction BEGIN TRANSACTION si SET IMPLICIT_TRANSACTIONS a la valeur ON ouvre deux transactions imbriquées. Incréments BEGIN_TRANSACTION @@trancount chaque fois qu'une transaction est active.

La valeur de SET IMPLICIT_TRANSACTIONS est définie lors de l'exécution, et non pas durant l'analyse.

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.

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

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.

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 transaction.
COMMIT TRANSACTION;
GO

Voici l'ensemble des résultats.

Tran count at start = 2
Use explicit transaction.
Tran count in explicit transaction = 3
Tran count after explicit transaction = 2
Setting IMPLICIT_TRANSACTIONS ON.
Use implicit transactions.
Tran count in implicit transaction = 2
Tran count after implicit transaction = 1
Nest an explicit transaction with IMPLICIT_TRANSACTIONS ON.
Tran count before nested explicit transaction = 1
Tran count after nested BEGIN TRAN in implicit transaction = 2
Tran count after nested explicit transaction = 1

Voir aussi

Référence

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)

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)