mercredi 28 janvier 2009

Transaction déclarative dans Spring & RuntimeException

L'un des avantages de Spring est sa capacité de gérer les transactions de façon déclarative! évident !

J'ai eu (encore une autre fois) un appel d'urgence d'un client à ce propos.

L'urgence était au stade panique : « … le transactionnel de Spring avec Hibernate et JdbcTemplate, ça marche pas !, L'application a fait un débit d'un compte, a eu un problème lors du l'inscription du crédit, et n'a pas fait un « roll back » sur le débit, …

Conclusion : Spring ne sait pas gérer les transactions !! »

Un blasphème selon la communauté des « Springiens »

Une fois sur place, je commence par vérifier la « règle numéro 1 » de bon voisinage dans une transaction : l'information en cas de problème !

Je commence par la couche DAO, et je remonte petit à petit, et patiemment...

Premier constat : l'un des développeurs « catch » des exceptions sql et ne lève pas à la place une RuntimeException, il fait du log...

Second constat : un autre développeur « catch » des exceptions et lève à la place des exceptions simple de type Exception.

Une fois ces deux points corrigés, le miracle se produit : Spring gère très bien les transactions déclaratives

Morale de l'histoire : il ne suffit pas de bien faire les déclarations, que ce soit par des annotations ou bien par l'ajout de ce tag XML comme suit

<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager" lazy-init="true">

<property name="sessionFactory" ref="sessionFactory" />

</bean>

<bean id="txProxyTemplate" abstract="true"

class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">

<property name="transactionManager" ref="transactionManager"/>

<property name="transactionAttributes">

<props>

<prop key="save*">PROPAGATION_REQUIRED</prop>

<prop key="remove*">PROPAGATION_REQUIRED</prop>

//

</props>

</property>

</bean>


Mais, le plus important c'est de savoir que dans ce mode Spring va réaliser le rollback si une des méthodes lève une exception non gérée de type RuntimeException

(Cela rappelle les débuts des EJB et des arguments avancés par leurs défenseurs)


Rappelons que cette façon de faire pourra être modifiée, mais ceci est un autre sujet ...

NB du 07/02/2009 : un article à lire : Transaction strategies: Understanding transaction pitfalls

0 commentaires :

Enregistrer un commentaire

Architecte SOA & Professionnel Open Source Headline Animator

 
Khaled BEN DRISS
Cloud Computing, SOA et Web 2.0 : Des sujets techniques sur SOA et l'Open Source : de Java & .Net, PHP5, Symfony, à SaaS / PaaS en passant par Azure, google appengine, le BPM, la Modélisation et d'autres sujets du coté du serveur et cloud computing.