Je suis à la recherche d'un modèle de code générique pour gérer correctement la transaction en ce qui concerne l'exception possible. Je présume qu'il existe un modèle de code commun, quel que soit le type de transaction concrète que nous traitons.Quel est le modèle de code approprié pour finaliser les transactions en Java (rollback sur exception et commit en cas de succès)?
J'ai une méthode qui exécute quelque chose dans la transaction et qui veut renvoyer Exception qui peut se produire à l'intérieur du bloc de code transactionnel. Voici un exemple de cette méthode:
protected void doIt() {
// for JDBC connection transaction may be started automatically
// but assume we start it here
Tran tran = session.beginTran();
try {
// here comes code that does some processing
// modifies some data in transaction
// etc.
// success - so commit
tran.commit();
} catch (Exception ex) { // many different exceptions may be thrown
// subclass of RuntimeException, SQLException etc.
// error - so rollback
tran.rollback();
// now rethrow ex
throw ex; // this line causes trouble, see description below
}
}
maintenant - il y a erreur de compilation dans la méthode doIt
. Il doit déclarer throws Exception
mais ce n'est pas acceptable parce que la méthode doIt
est utilisée dans de nombreux endroits et l'ajout throws Exception
conduit à des modifications ultérieures dans les lieux d'utilisation directe et indirecte de doIt
. C'est à cause d'un problème connu de conception de langage Java avec des exceptions déclarées.
Maintenant, la question: comment changer exception vs code de gestion des transactions pour atteindre mon objectif - gérer correctement la finalisation de la transaction (effectuer validée ou annulée en fonction des conditions de réussite) et réémettre exactement la même exception qui peut être attrapée dans le code transactionnel bloc.
Je sais que je pourrais faire quelque chose comme throw new RuntimeException(ex)
mais cela jette une exception d'autre classe et je veux éviter une telle solution.
Vous devez être conscient de la simultanéité - presque tous les systèmes transactionnels semblent être utilisés dans un contexte concurrent, et ce code ne semble pas défendre particulièrement bien contre cela ... –
Solution. – jspcal
@Alex: qu'est-ce que cela a à voir avec la concurrence? Quel est le problème avec ce code considérant la concurrence? Comment "défendre"? Voulez-vous s'il vous plaît expliquer? – WildWezyr