Bonjour,

J'utilise l'annotation @Transactional pour gérer les transactions au niveau de la connexion à la base de données. Mais ça ne marche pas. C'est comme si l'annotation n'était pas détectée par Spring et que ma Connection était en autocommit true. Du coup, lorsque je fais un rollback, la transaction est quand même commitée.
Ça fait un bout de temps que je cherche, sans trouver la cause du problème. Si vous pouviez éclairer ma lanterne
Pour info, ma base de données est dans un conteneur Docker

Voici ma configuration :
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 
@Configuration
@EnableTransactionManagement
@EnableWebMvc
@ComponentScan("fr.test")
public class SpringConfig extends WebMvcConfigurerAdapter {
 
    private DriverManagerDataSource ds = new DriverManagerDataSource();
 
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/css/**", "/js/**");
    }
 
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
 
    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver bean = new InternalResourceViewResolver();
        bean.setViewClass(JstlView.class);
        bean.setPrefix("/WEB-INF/jsp/");
        bean.setSuffix(".jsp");
        return bean;
    }
 
    @Bean
    public DriverManagerDataSource dataSource() {
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://172.17.0.2:3306/test");
        ds.setUsername("test");
        ds.setPassword("123");
        return ds;
    }
 
    @Bean
    public DataSourceTransactionManager txManager() {
        DataSourceTransactionManager txManager = new DataSourceTransactionManager();
        txManager.setDataSource(ds);
        return txManager;
    }
Et voici un extrait de mon service et de mon DAO:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 
@Service
public class RegisterServiceImpl implements IRegisterService {
 
    @Autowired
    private RegisterDAO registerDAO;
 
    @Transactional(rollbackFor=Throwable.class)
    @Override
    public long register(VisitorModel visiteur) throws BusinessException {
        return registerDAO.register(visiteur, utilisateur);
    }
}
 
@Repository
public class RegisterDAO {
 
    @Autowired
    private DataSource ds;
 
    public long register(VisitorModel visitor) {
        String sql = "insert into visitor (email, password) values (?, ?)";
 
        try {
            Connection c = ds.getConnection();
            PreparedStatement ps = c.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
            ps.setString(1, visitor.getEmail());
            ps.setString(2, visitor.getPassword());
 
            ps.executeUpdate();
 
            ResultSet rs = ps.getGeneratedKeys();
            //rs.next(); requis, donc une exception est levée lorsque cette instruction est commentée
            return rs.getLong(1);
        } catch (SQLException e) {
            // pas de rollback lorsqu'une exception est levée
            throw new TechnicalException(e);
        }
    }
}