Bonjour,

Dans un programme C#, j'ai tenté de faire des transactions imbriquées comme je le faisait en 1999 avec VBScript et le connecteur OLEDB pour SQL Server 7.0

Seul hic, j'ai une erreur comme quoi c'est pas supporté par l'objet.

Qu'à cela ne tienne, je tente de le faire "à la main" en SQL.

Voici l'étendue des mes connaissances à propos des transactions, telles que je les ai apprises.
Il me semble qu'avec SQL Server 7 ou 2000, ça marchait... A moins que je ne confonde avec Oracle (????) J'avoue que j'ai de plus en plus de doutes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
begin transaction A
  insert into matable (champ) values ('valeur a');
  begin transaction b
    insert into matable (champ) values ('valeur b');
  rollback transaction B -- on annule l'insertion de 'valeur b'
commit transaction A -- on valide l'insertion de 'valeur a'
=> Bref, à la fin du script, on n'a que "valeur a" dans la base.

Seul hic, SQL Server n'a pas l'air de l'entendre de cette oreille :

Voici ce que j'ai tenté de faire, dans Entreprise Manager :
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
begin transaction a
  insert into test (name) values ('test 1');
  begin transaction b
    insert into test (name) values ('test 2');
  rollback transaction b
commit transaction a
Ça plante sur le premier rollback. Pourquoi ?
Impossible de restaurer b. Ni transaction ni point d'enregistrement de ce nom n'a été trouvé.
J'ai donc tenté, selon les conseils de Bluedeep :
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
begin transaction a
  insert into test (name) values ('test 1');
  begin transaction b
  save transaction c
    insert into test (name) values ('test 2');
  rollback transaction c
commit transaction a
Ça passe, mais la transaction est jugée "non terminée". Aussi, je ne vois pas ce que vient faire un savepoint au milieu...

Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
begin transaction a
  insert into test (name) values ('test 1');
  begin transaction b
  save transaction c
    insert into test (name) values ('test 2');
  rollback transaction c
commit transaction a
commit transaction a
Ça passe, et cette fois la transaction est bien terminée.
Sauf que je vois pas comment je pourrais générer programmatiquement ce double commit (et surtout, je vois pas à quoi il sert !)

D'autaut que si j'en met un 3°, ça plante !

Bref, quelqu'un peut me donner la syntaxe qui marche pour imbriquer des transactions dans SQL Server ?

J'utilise la 2008 R2 Express