开发者社区> 问答> 正文

JAVA Spring + Mybatis如何控制事务在service层

问题如题,本人使用的是spring tx+aop,配置控制到了services层,配置如下:

<tx:advice id="yqTxAdvice" transaction-manager="transactionManager">
  <tx:attributes>
   <tx:method name="delete*" propagation="REQUIRED" read-only="false"
    rollback-for="java.lang.Exception" no-rollback-for="java.lang.RuntimeException" />
   <tx:method name="insert*" propagation="REQUIRED" read-only="false"
    rollback-for="java.lang.Exception" />
   <tx:method name="update*" propagation="REQUIRED" read-only="false"
    rollback-for="java.lang.Exception" />
   <tx:method name="find*" propagation="SUPPORTS" />
   <tx:method name="get*" propagation="SUPPORTS" />
   <tx:method name="select*" propagation="SUPPORTS" />
   <tx:method name="query*" propagation="SUPPORTS" />
  </tx:attributes>
 </tx:advice>

<aop:config>
  <aop:pointcut id="pc"
   expression="execution(* com.yinqing.mosweb.serivices.*.*(..))" /> <!--把事务控制在Service层 -->
  <aop:advisor pointcut-ref="pc" advice-ref="yqTxAdvice" />
 </aop:config>

然后JAVA services中执行如下代码:

@Autowired
 public CellInfoMapper cellInfoMapper;

private static void test() throws Exception{
  throw new Exception();
 }
 
 public boolean insertBatch(List<CellInfoModel> cellInfoModels){
  try{
   Long before = System.currentTimeMillis();
   cellInfoMapper.deleteAll();
   test();
   cellInfoMapper.insertBatch(cellInfoModels);
   Long takeTime = System.currentTimeMillis()-before;
   logger.info("data size :"+cellInfoModels.size()+" take time(millis)"+takeTime);
   return true;
  }catch(Exception e){
   logger.info("批量插入小区信息数据错误!");
   e.printStackTrace();
   return false;
  }
 }

在如上代码中,可以明白,当执行delete方法后,抛出一个异常,然后才执行insertBatch方法,目的是模拟delete方法执行后,后续执行的代码中有异常抛出,此时需要rollback执行了删除的数据。但是发现,如此配置无效,无法将delete的数据rollback回来。

我希望的是一个service方法,不管调用了多少次mapper,都处于同一个事务中,services方法结束,才为一个完整的事务。

展开
收起
a123456678 2016-03-16 14:06:34 3076 0
1 条回答
写回答
取消 提交回答
  • 你insert*方法中的异常未抛出,spring不知道发生了异常。
    未抛出的原因是在catch中使用了return语句,导致异常无法抛出insert*方法之外。
    一般是绝对禁止在catch 和finally中使用return语句的。主要是会丢失掉抛出的异常。

    2019-07-17 19:03:55
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
Java Spring Boot开发实战系列课程【第6讲】:Spring Boot 2.0实战MyBatis与优化(Java面试题) 立即下载