事务回滚小结

    xiaoxiao2022-07-03  128

    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。

    最新回复(0)