我在一些桌面应用程序中使用spring jdbcTemplate。
我正在尝试回滚一些数据库操作,但我不知道如何使用此对象(JdbcTemplate)管理事务。我正在通过方法序列进行多次插入和更新。当任何操作失败时,我需要回滚以前的所有操作。
任何想法?
更新...我尝试使用@Transactional,但回滚不会发生。
我是否需要在JdbcTemplate上进行一些先前的配置?
我的例子:
@Transactional(rollingbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
public void Testing(){
jdbcTemplate.exec("Insert into table Acess_Level(IdLevel,Description) values(1,'Admin')");
jdbcTemplate.exec("Insert into table Acess_Level(IdLevel,Description) values(STRING,'Admin')");
}
IdLevel是一个NUMERIC参数,因此......在我们的第二个命令中将发生异常。当我在数据库中看到表格时,我可以看到第一个插入...但是,我认为这个操作应该回滚。
出了什么问题?
答案 0 :(得分:2)
JdbcTemplate本身并不处理事务。您应该使用TransactionTemplate或@Transactional注释:使用此功能,您可以在事务中对操作进行分组,并在出现错误时回滚所有操作。
@Transactional
public void someMethod() {
jdbcTemplate.update(..)
}
答案 1 :(得分:2)
在Spring中,私有方法不会被代理,因此注释将不起作用。请参阅此问题:Does Spring @Transactional attribute work on a private method?。
创建服务并将@Transactional放在您想要成为事务的公共方法上。看起来更正常的Spring代码有简单的DAO对象,每个对象执行一个作业并且注入了几个,而不是在它自己的事务中执行多个SQL调用的复杂DAO对象。