Bonjour à toutes et à tous,
Voilà, j'aimerais faire des tests sur ma BD, et j'aimerais qu'à la fin d'une transaction, toutes mes modifications soient rollbackées.
Pour ce faire, j'ai un DAO qui est comme suit (il s'agit de l'implémentation DaoImpl, j'ai bien une interface Dao):
Dans mon service :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 public class BatchDaoImpl implements BatchDao { ... @Transactional public void testTransaction() { int nb = jdbcTemplate.update("insert into ..."); System.out.println("Number of transaction : " + nb); } }
Ma configuration Spring data-source.xml :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 public class UpdateDataImpl implements UpdateData { private BatchDao dao; public void process() { System.out.println("STARTING..."); try { testTransaction(); } catch (RuntimeException re) { System.out.println("Catching Rollback..."); } System.out.println("ENDING....."); } @Transactional public void testTransaction() { try { dao.testTransaction(); } catch (Exception e) { e.printStackTrace(); } throw new RuntimeException("Rollbacking..."); } ... }
Et mon applicationContext :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 <?xml version="1.0" encoding="UTF-8"?> <beans ...> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="oracle.jdbc.OracleDriver"/> <property name="url" value="..."/> <property name="username" value="..."/> <property name="password" value="..."/> </bean> <bean id="jdbcTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <tx:annotation-driven transaction-manager="jdbcTransactionManager"/> </beans>
Tout cela me semble correct, pourtant si j'exécute mon application (qui basiquement va lancer BatchDaoImpl.process()), j'ai les logs suivants :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 <?xml version="1.0" encoding="UTF-8"?> <beans ...> <import resource="data-source.xml"/> <bean id="batchDao" class="mon.appli.dao.BatchDaoImpl"> <property name="dataSource" ref="dataSource"/> </bean> <bean id="updateData" class="mon.appli.process.UpdateDataImpl"> <property name="dao" ref="batchDao"/> </bean> </beans>
Le souci, c'est que l'enregistrement est bien conservé dans ma base de données...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4STARTING... Number of transaction : 1 Catching Rollback... ENDING.....
A noter que si j'enlève @Transactional à la méthode testTransaction du DAO, mon problème persiste.
Mais si je mets @Transactional(propagation = Propagation.MANDATORY) sur cette même méthode, il me fait une erreur (org.springframework.transaction.IllegalTransactionStateException: No existing transaction found for transaction marked with propagation 'mandatory') ce qui me pousse à penser que la transaction au niveau du service (UpdateDataImpl) n'est pas créée !
Ma question est donc : qu'ai-je oublié pour activer la transaction ?
Merci !
Edit : J'utilise Spring 2.0.6
Partager