@Transactional注解的触发,只回滚RuntimeException和Error异常,默认不回滚非RuntimeException异常
解决方法:
1.方法前添加注解(基础的 @Transactional注解:只能拦截RuntimeException和Error异常)
@Transactional(rollbackFor = Exception.class) //抛出捕获的非RuntimeException异常
2.catch中添加(手动进行回滚)
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();//手动回滚
3.在catch中手动抛出运行时异常
throw new RuntimeException(e);//(惰性处理,不建议)
try {
//业务代码
} catch (Exception e) {
throw new RuntimeException(e);
}
注意:第一点和第二点 建议一起使用,如果接口本身有封装事务,在不了解原有事务配置的情况下,又没有声明 @Transactional(rollbackFor = Exception.class) 注解,可能导致事务手动回滚失败。
@RequestMapping("channelAdd")
@ResponseBody
@Transactional(rollbackFor = Exception.class)
public AjaxResult channelAdd( PcChannelVo vo) throws Exception {
try {
//业务代码
} catch (Exception e) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();//手动回滚
log.error("异常",JsonUtil.toJSON(vo),e);
return AjaxResult.error("");
}finally {
}
如果以上三种方法都没有解决事务不回滚问题:
可以在调用该方法的方法,加@Transactional。在上级方法添加@Transactional,不管调用的方法如何,有报错就会执行回滚。也就不用管是否加了try{}catch{}。
转载: