avril
2012
La norme SQL standard (ANSI/ISO) affirme que :
1. la première instruction SQL lancée depuis une session est considérée comme le début d’une transaction (même si le verbe BEGIN TRANSACTION n’est pas indiqué).
2. la fin de toute transaction DOIT se terminer de façon EXPLICITE par un ROLLBACK ou un COMMIT.
C’est ce que dit la norme SQL à propos de la notion de début et fin d’une transaction SQL.
Rappelons qu’une transaction SQL est une entité logique comportant une ou plusieurs instruction SQL.
Par défaut SQL SERVER considère chaque instruction comme une transaction et fait des COMMITs implicites après chaque exécution : c’est l’AUTOCOMMIT.
Par défaut ORACLE fait des commit implicites à la fin de chaque instruction DDL (CREATE, ALTER, DROP). Notons que sur ce point ORACLE est plus proche de la norme que SQL SERVER.
Ce que je ne comprends pas c’est la confusion que crée MS SQL SERVER autour de la définition de l’option AUTOCOMMIT. De quoi s’agit-il exactement ?
D’après la documentation officielle de MS SQL SERVER :
Version originale
——————
SET IMPLICIT_TRANSACTIONS { ON | OFF }
Sets implicit transaction mode for the connection.
When ON, SET IMPLICIT_TRANSACTIONS sets the connection into implicit transaction mode.
When OFF, it returns the connection to autocommit transaction mode.
Traduction en français
———————–
SET IMPLICIT_TRANSACTIONS { ON | OFF }
Définit le mode de transaction implicite pour la connexion.
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.
D’après ce qui est écrit dans la documentation officielle :
SET IMPLICIT_TRANSACTIONS OFF = AUTOCOMMIT (validation automatique).
Mais le problème c’est que si IMPLICIT_…. est OFF on peut penser qu’on est en mode EXPLICIT_… et en EXPLICIT_… ce n’est plus de l’AUTOCOMMIT !
=> Sous SQL SERVER
D’abord comment identifier l’option SET IMPLICIT_TRANSACTIONS de ma session ?
ELSE 'IMPLICIT_TRANSACTIONS OFF'
END 'IMPLICIT_TRANSACTIONS'
Exemple avec SET IMPLICIT_TRANSACTIONS OFF
———————————————
Session 1
———
SET IMPLICIT_TRANSACTIONS OFF
CREATE TABLE t1(c INT);
INSERT INTO t1 VALUES (1);
Session 2
———
SELECT * FROM t1
La session 2 affiche bien les données de la table t1
Exemple avec SET IMPLICIT_TRANSACTIONS ON
———————————————
Session 1
———
SET IMPLICIT_TRANSACTIONS ON
CREATE TABLE t1(c INT);
INSERT INTO t1 VALUES (1);
Session 2
———
SELECT * FROM t1
Impossible de lire les données de la table t1 depuis la session 2, puisque la transaction n’est pas encore validée (commit) par la session 1
=> Sous ORACLE
D’abord comment identifier l’option AUTOCOMMIT de ma session ?
SQL> SHOW AUTOCOMMIT;
Exemple avec AUTOCOMMIT ON
———————————————
Session 1
———
CREATE TABLE t1(c INT);
INSERT INTO t1 VALUES (1);
Session 2
———
SELECT * FROM t1
La session 2 affiche bien les données de la table t1
Exemple avec AUTOCOMMIT OFF
———————————————
Session 1
———
CREATE TABLE t1(c INT);
INSERT INTO t1 VALUES (1);
Session 2
———
SELECT * FROM t1
Impossible de lire les données de la table t1 depuis la session 2, puisque la transaction n’est pas encore validée (commit) par la session 1
Pour conclure notons que pour MS SQL SERVER SET IMPLICIT_TRANSACTIONS OFF = AUTOCOMMIT. À mon humble avis, MS SQL SERVER devrait plutôt mettre SET IMPLICIT_TRANSACTIONS ON = AUTOCOMMIT
——————————
Etienne ZINZINDOHOUE
——————————
Cette dernière utilise le terme « transaction » pas « BEGIN TANSACTION ».
>> On joue sur les mots ici mais peu importe c’est bel et bien une transaction qui est initiée et c’est l’utilisateur qui a le contrôle de la validation ou de l’annulation.
Tiens, dans ta tentative d’explication, les termes IMPLICITE et EXPLICITE apparaissent
>> et il y a aussi le terme IMPLICIT AUTOCOMMIT qui apparaît. Tu parles d’ailleurs dans ton titre de AUTOCOMMIT ou COMMIT IMPLICITE ou encore en fin de billet de « À mon humble avis, MS SQL SERVER devrait plutôt mettre SET IMPLICIT_TRANSACTIONS ON = AUTOCOMMIT » et c’est bien la le problème. IMPLICIT_TRANSACTION ne veut pas dire IMPLICT AUTOCOMMIT et c’est bien la que le problème de compréhension appararaît selon moi. Je trouve génant de mettre en face d’une telle option un comportement qui ne l’est pas.
++
BEGIN TRAN ? ce n’est pas ce que dit la documentation officielle de MS SQL Server. Cette dernière utilise le terme « transaction » pas « BEGIN TANSACTION ». Et c’est justement ça qui prête à confusion. Tiens, dans ta tentative d’explication, les termes IMPLICITE et EXPLICITE apparaissent, je ne sais pas si tu as fait exprès . Et c’est justement tout ça qui prête à confusion. C’est pour celà que je propose un terme qui prête moins à confusion.
En tout cas merci pour ton commentaire
Il faut peut être simplement revoir le raisonnement autour de l’option IMPLICIT_TRANSACTIONS. A priori on pourrait penser que l’on aura une validation automatique lorsque cette option est activée comme tu le dis mais il n’en est rien.
IMPLICIT_TRANSACTION veut simplement dire ici qu’implicitement une instruction BEGIN TRAN sera être lancée et qu’il faudra explicitement la valider ou l’annuler à l’aide de COMMIT ou ROLLBACK. IMPLICIT_TRANSACTION ne veut pas dire IMPLICIT AUTOCOMMIT. Le contrôle de validation est ici laisser à l’utilisateur.