@Transactional ne marche pas
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:
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:
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);
}
}
} |