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):

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);
    }
}
Dans mon service :

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...");
    }
 
    ...
}
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
 
<?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>
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
<?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>
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
STARTING...
Number of transaction : 1
Catching Rollback...
ENDING.....
Le souci, c'est que l'enregistrement est bien conservé dans ma base de données...

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