mai
2012
Petite discussion sur les transactions implicite, explicite et auto-commit d’une part et variation de la variable @@TRANCOUNT en fonction de l’option SET IMPLICIT_TRANSACTIONS d’autre part. Il s’agit ici des transactions SQL, des transactions au sein du SGBD SQL Server.
=> Transaction explicite
———————-
Une transaction est dite explicite lorsqu’on indique le début (BEGIN TRANSACTION) et la fin (COMMIT TRANSACTION ou ROLLBACK TRANSACTION) de la transaction
Exemple
——–
-- ici instruction(s) SQL
create table t (col char(1))
insert into t values ('1')
COMMIT TRANSACTION
=> Transaction implicite
Une transaction est dite implicite lorsqu’il n’y a pas de BEGIN TRANSACTION pour indiquer le début de la transaction. Cette dernière est automatiquement démarrée par l’une des commandes :
ALTER TABLE, CREATE, DELETE, DROP, FETCH, GRANT, INSERT, OPEN, REVOKE, SELECT, TRUNCATE TABLE, UPDATE
mais il est indispensable de valider la transaction implicite par COMMIT TRANSACTION ou de l’annuler avec ROLLBACK TRANSACTION.
Pour activer ce mode de fonctionnement sous SQL Server, il suffit d’exécuter la commande :
SET IMPLICIT_TRANSACTIONS ON
Exemple
——–
-- ici instruction(s) SQL
create table t (col char(1))
insert into t values ('1')
COMMIT TRANSACTION
=> Autocommit
Si en l’abscence des verbes BEGIN TRANSACTION, COMMIT TRANSACTION ou ROLLBACK TRANSACTION chaque instruction SQL est considérée comme une transaction alors on dit qu’on est en mode autocommit. Dans ce cas chaque instruction SQL est automatiquement validée (s’il n’y a pas d’erreur) ou annuler (s’il y a erreur). C’est le mode de fonctionnement par défaut sous SQL Server. Pour activer ce mode de fonctionnement sous SQL Server, il suffit d’exécuter la commande :
SET IMPLICIT_TRANSACTIONS OFF
Exemple
——–
create table t (col char(1))
insert into t values ('1')
insert into t values ('12') -- échec lors de l'insertion de cette ligne
select * from t -- on a une ligne dans la table
=> @@TRANCOUNT en fonction de l’option IMPLICIT_TRANSACTIONS
–>1# @@TRANCOUNT et SET IMPLICIT_TRANSACTIONS OFF
print '@@TRANCOUNT avant begin : ' + cast (@@TRANCOUNT as char(1))
BEGIN TRANSACTION
print '@@TRANCOUNT après begin : ' + cast (@@TRANCOUNT as char(1))
create table t (col char(1))
print '@@TRANCOUNT après create : ' + cast (@@TRANCOUNT as char(1))
insert into t values ('1')
print '@@TRANCOUNT après insert : ' + cast (@@TRANCOUNT as char(1))
COMMIT TRANSACTION
print '@@TRANCOUNT après commit : ' + cast (@@TRANCOUNT as char(1))
Résultat
———
@@TRANCOUNT avant begin : 0
@@TRANCOUNT après begin : 1
@@TRANCOUNT après create : 1
(1 row(s) affected)
@@TRANCOUNT après insert : 1
@@TRANCOUNT après commit : 0
–>2#@@TRANCOUNT et IMPLICIT_TRANSACTIONS ON avec BEGIN TRANSACTION
print '@@TRANCOUNT avant begin : ' + cast (@@TRANCOUNT as char(1))
BEGIN TRANSACTION
print '@@TRANCOUNT après begin : ' + cast (@@TRANCOUNT as char(1))
create table t (col char(1))
print '@@TRANCOUNT après create : ' + cast (@@TRANCOUNT as char(1))
insert into t values ('1')
print '@@TRANCOUNT après insert : ' + cast (@@TRANCOUNT as char(1))
COMMIT TRANSACTION
print '@@TRANCOUNT après commit : ' + cast (@@TRANCOUNT as char(1))
Résultat
———
@@TRANCOUNT avant begin : 0
@@TRANCOUNT après begin : 2
@@TRANCOUNT après create : 2
(1 row(s) affected)
@@TRANCOUNT après insert : 2
@@TRANCOUNT après commit : 1
–>3#@@TRANCOUNT et IMPLICIT_TRANSACTIONS ON sans BEGIN TRANSACTION
print '@@TRANCOUNT après set implicit on : ' + cast (@@TRANCOUNT as char(1))
create table t (col char(1))
print '@@TRANCOUNT après create : ' + cast (@@TRANCOUNT as char(1))
insert into t values ('1')
print '@@TRANCOUNT après insert : ' + cast (@@TRANCOUNT as char(1))
COMMIT TRANSACTION
print '@@TRANCOUNT après commit : ' + cast (@@TRANCOUNT as char(1))
Résultat
———
@@TRANCOUNT après set implicit on : 1
@@TRANCOUNT après create : 1
(1 row(s) affected)
@@TRANCOUNT après insert : 1
@@TRANCOUNT après commit : 0
Bonne fête du travail
————————-
Etienne ZINZINDOHOUE
————————-