原因:try catch语句会捕获你发出的异常 @Transactional感知不到抛出的异常 自然也就不会进行事物回滚
解决:
1.使用以下配置(基础的 Transactional配置只能拦截RuntimeException和Error异常)
@Transactional(rollbackFor = Exception.class)
2.catch中添加(手动进行回滚)
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();//回滚
完整代码
@Transactional(rollbackFor = Exception.class)
public AjaxResult add(@RequestBody XdnCompany xdnCompany) {
try {
//方法1
//方法2
return
} catch (Exception e) {
e.printStackTrace();
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();//回滚
return error("出错了,请刷新后重试");
}
}
当 B 中抛出了一个异常以后,B 标识当前事务需要 rollback。但是由于 A 手动捕获该异常并进行处理,A 认为当前事务应该正常 commit。此时就出现了前后不一致,也就是因为这样,抛出了前面的UnexpectedRollbackException
。
Spring 的事务是在调用业务方法之前开始的,业务方法执行完毕之后才执行 commit/rollback,事务是否执行取决于是否抛出 RuntimeException。如果抛出 RuntimeException,并在业务方法中没有 catch 的话,事务会回滚。