Bonjour,
Le problème en quelques mots :
j'ai une classe qui recoit des operations, effectue les opérations en base de données, et renvoie un résultat. Cette classe s'appelle moteur par exemple. Si l'opération échoue, cad renvoie une exception, un rollback a lieu, si elle réussit, un commit a lieu.
Le problème que j'ai est le suivant. J'ai maintenant une opération a créer, qui s'appelle par exemple op, composée de trois opérations unitaire. Appelons les op1 , op2 et op3, chacune bien sur fait des modifications dans la base, et est géré par op, qui appelle le moteur avec chaque opération.
op appelle dans l'ordre op1 puis op3, et potentiellement op2
Le problème se situe au niveau du mécanisme des commit et rollback au sein de l'opération op.
Voila ce que je veux :
Le problème est le suivant, je ne peux pas toucher au "moteur". et je dois pouvoir annuler op3.j'exécute op1
(*)
si op1 réussit (il doit théoriquement, sinon exception et ca s'arrete la)
j'exécute op3
si op3 réussit, c'est gagné, pas de soucis
sinon
j'annule op3
je fais op2
avec les résultats de op2, je fais un nouveau op3
si op3 réussit, op est fini, sinon toujours l'envoi d'exception et le rollback auto
Si je commit après l'exécution de op1 (*), que je crée une nouvelle transaction, si op2 et/ou op3 échoue, le rollback final n'a plus de prise sur op1 évidemment, et c'est un problème.
Je ne vois pas de manière simple de gèrer une transaction pour l'opération op, et une sorte de sous transaction pour l'exécution de op3, de manière à ne pas avoir :
op1 -> op3 (échoue) -> op1 -> op2 -> op3
Ce qui fait un nouvel appel à op1, à cause du rollback que je suis obligé de faire, et c'est assez couteux.
Merci pour votre aide, j'espère que vous comprendrez quelque chose à mon problème
Partager