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.
=> Bref, à la fin du script, on n'a que "valeur a" dans la base.
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'
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 :
Ça plante sur le premier rollback. Pourquoi ?
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
J'ai donc tenté, selon les conseils de Bluedeep :Impossible de restaurer b. Ni transaction ni point d'enregistrement de ce nom n'a été trouvé.
Ç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 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, et cette fois la transaction est bien terminée.
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
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
Partager