使用JdbcTemplate开始和回滚事务

时间:2016-01-28 19:47:38

标签: java spring transactions

我在一些桌面应用程序中使用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参数,因此......在我们的第二个命令中将发生异常。当我在数据库中看到表格时,我可以看到第一个插入...但是,我认为这个操作应该回滚。

出了什么问题?

2 个答案:

答案 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对象。