版权声明:powered by 大狼狗郑锴/Moshow魔手 https://blog.csdn.net/moshowgame/article/details/84561654
问题背景
有时候,我们总是需要再SpringBoot2中对一个Service方法做一个完整的事务,发现异常时,进行回滚,然后又能返回错误信息。
场景一:自动回滚(直接抛出,不try/catch)
@Override
@Transactional(rollbackFor = Exception.class)
public Object submitOrder() throws Exception {
success();
//假如exception这个操作数据库的方法会抛出异常,方法success()对数据库的操作会回滚。
exception();
return ApiReturnUtil.success();
}
场景二:手动回滚(进行try/catch,回滚并抛出)
@Override
@Transactional(rollbackFor = Exception.class)
public Object submitOrder (){
success();
try {
exception();
} catch (Exception e) {
e.printStackTrace();
//手工回滚异常
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return ApiReturnUtil.error();
}
return ApiReturnUtil.success();
}
补充:回滚部分异常
- 使用
Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint();
设置回滚点。 - 使用
TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);
回滚到savePoint
。
@Override
@Transactional(rollbackFor = Exception.class)
public Object submitOrder (){
success();
//只回滚以下异常,
Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint();
try {
exception();
} catch (Exception e) {
e.printStackTrace();
//手工回滚异常
TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);
return ApiReturnUtil.error();
}
return ApiReturnUtil.success();
}