捕获异常后的事务RollBack

时间:2015-01-05 09:48:47

标签: java spring transactions

有没有办法在使用声明式事务管理捕获异常后回滚事务。我有这段代码。

@Component
@Transactional(rollbackFor = EvictionException.class)
Public class Eviction{

@Autowired
private Alerter alerter;

@Scheduled(cron = "${evictor.cron.expression}")
public void evictObjectFromDatabase(){
try{
   ....
   DO SOME DELETION QUERIES
}catch(Exception ex){
   alerter.produceAlert("Failed to delete entries from database");
}
}
}

如果在删除时产生异常,我需要发出另一个团队监视swing UI的警报。此外,我需要回滚事务,但使用rollBackFor = Exception.class不起作用。

2 个答案:

答案 0 :(得分:1)

您需要使用@Transactional(rollbackFor = Exception.class)注释您的方法,并在catch块中抛出异常(以便事务代理可以检测异常并因此回滚)例如。

try{
   ....
   DO SOME DELETION QUERIES
}catch(Exception ex){
   alerter.produceAlert("Failed to delete entries from database");
   throw ex;// this is important
}

答案 1 :(得分:0)

@Ambuj Jauhari 如果您查看@transactional 的文档,则会因错误或运行时异常而发生回滚。在您没有为异常 .class 提供回滚时,最有可能发生回滚,因为抛出的异常是运行时异常而不是任何已检查异常。如果抛出的异常类型是任何已检查异常,那么如果您没有为 exception.class 属性提供回滚,就不会发生回滚