事务回滚小结
程序员文章站
2022-03-05 10:10:53
...
1.事务回滚机制在程序中运用的非常之多,我们常用的方式就是 注解的方式 也就是在我们的service层 加上一个@Transactional这样既可
2.但是有些时候我们并不需要所有的事件都回滚 ,这样就需要我们自己手动回滚事务了 再次说说手动事务回 TransactionAspectSupport
3.在项目中碰到这样的需求 供大家参考
ResultMap resultMap1 = gradeDepartmentService.changeGradeDepsAndGrades1(memberToken, schoolUpdateReq);
if (!resultMap1.getCode().equals(ResultMap.success().getCode()))
{
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return resultMap1;
}
这里既是手动回滚前面的操作。
4.原因补充
默认spring事务只在发生未被捕获的 runtimeExcetpion时才回滚。
spring aop 异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到方法的异常,才能进行回滚,默认情况下aop只捕获runtimeException的异常,但可以通过 配置来捕获特定的异常并回滚
5.
//代码实现的方式
if(userSave){
try {
userDao.save(user);
userCapabilityQuotaDao.save(capabilityQuota);
} catch (Exception e) {
logger.info("能力开通接口,开户异常,异常信息:"+e);
throw new RuntimeException();
}
}
或者:
if(userSave){
try {
userDao.save(user);
userCapabilityQuotaDao.save(capabilityQuota);
} catch (Exception e) {
logger.info("能力开通接口,开户异常,异常信息:"+e);
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
另外一种方式回滚到切入点
使用Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint(); 设置回滚点,使用TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);回滚到savePoint。