1. 抛出检查异常导致事务不能正确回滚
- 原因:Spring默认只会回滚非检查异常。
- 解决:配置rollbackFor属性。
@Transactional(rollbackFor = Exception.class)
2. 业务方法内自己try-catch异常导致事务不能正确回滚
- 原因:事务通知只有捉到了目标抛出的异常,才能进行后续的回滚处理,如果目标自己处理掉异常,事务通知无法知悉。
- 解决1:异常原样抛出
@Transactional(rollbackFor = Exception.class)
public void test2()throws Exception{
try{
}catch (Exception e){
e.printStackTrace();
}
}
或者
@Transactional(rollbackFor = Exception.class)
public void test2(){
try{
}catch (Exception e){
e.printStackTrace();
throw new RuntimeException(e);
}
}
- 解决2:手动设置TransactionStatus.setRollbackOnly()