欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

事务回滚小结

程序员文章站 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。

相关标签: 事务