- 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
- Solution
- Les transactions sont automatisées en utilisant la Programmation Orientée Aspect (AOP) de Spring
- L’utilisation du Transaction Manager de Spring est suffisant pour l’utilisation des transactions locales
- 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).




Affichez votre portrait