Recevez les mises à jour gratuites du blog par Email : »» Garanti sans spam indésirable ««

Transactions locales : automatisation avec Spring AOP

de Mimie le 25 juillet 2009

Rubrique : Programmation

  • Problème

Comment faire pour annuler ou valider l’ensemble des modifications apportées sur une unique base de données dans une même méthode ?

Exemple : création d’un utilisateur = enregistrement données personnelles, enregistrement adresses, enregistrement profil et droit, affectation du compte à son service, etc.
Si à un moment où un autre une erreur survient (exemple à l’enregistrement des adresses), il ne faut pas que les données personnelles de l’utilisateur soit tout de même conservées, il faut tout rejeter et recommencer.

Transactions locales

Transactions locales

  • Solution
  1. Les transactions sont automatisées en utilisant la Programmation Orientée Aspect (AOP) de Spring
  2. L’utilisation du Transaction Manager de Spring est suffisant pour l’utilisation des transactions locales
  3. L’utilisation d’une connection JDBC est utilisée pour se connecter à l’unique source de données (un pool de connection serait meilleur mais notre exemple utilise le driver DriverManagerDataSource qui n’en est pas un)
  • Mise en place
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/dbExemple" />
</bean>
(déclarer jdbc/dbExemple au niveau de votre serveur d'application)
ou
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource>
    <property name="driverClassName" value="org.gjt.mm.mysql.Driver" />
    <property name="url" value="jdbc:mysql://localhost/exemple" />
    <property name="username" value="***" />
    <property name="password" value="***" />
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>
<bean id="logUserDAO" class="com.example.dao.jdbc.LogUserDAOImpl">
    <property name="dataSource" ref="dataSource" />
</bean>
<bean id="logUserServiceTarget" class="com.example.service.impl.LogUserServiceImpl" >
    <property name="logUserDao" ref="logUserDao" />
</bean>
<bean id="logUserService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="target" ref="logUserServiceTarget" />
    <property name="transactionManager" ref="transactionManager" />
    <property name="transactionAttributes">
       <props>
          <prop key="*">ISOLATION_DEFAULT, PROPAGATION_REQUIRED</prop>
       </props>
    </property>
</bean>
  • Explications

Le bean « logUserService » permet de répondre aux attentes.
L’utilisation de toutes les méthodes (key=*) du bean « logUserService », injecté ou récupéré du contexte spring, sont à présent interceptées pour qu’une transaction s’ouvre au début de chaque méthode et se ferme automatiquement à la fin des méthodes (Commit ou Rollback).

<bean id= »txManager »>
<property name= »dataSource » ref= »dataSource » />
</bean>

Cet article a été écrit par :

– qui a déjà rédigé 123 posts sur Des Geeks et des lettres.

Passionné d'informatique et développeur JavaEE de métier, je me consacre principalement à écrire des billets sur les sujets du Web et de la programmation Web. Ce blog est un espace qui me permet de partager mes découvertes avec vous et me sert accessoirement de pense bête !

Contacter l'auteur

Jetez aussi un oeil sur :

Laissez un Commentaire

Article précédent:

Article suivant: