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。