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 :
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
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; }
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); } } }
Partager