JAVA Spring + Mybatis如何控制事务在service层-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

2016-03-16 14:06:34 2741 1

问题如题,本人使用的是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方法结束,才为一个完整的事务。

取消 提交回答
全部回答(1)
  • a123456678
    2019-07-17 19:03:55

    你insert*方法中的异常未抛出,spring不知道发生了异常。
    未抛出的原因是在catch中使用了return语句,导致异常无法抛出insert*方法之外。
    一般是绝对禁止在catch 和finally中使用return语句的。主要是会丢失掉抛出的异常。

    0 0
相关问答

1

回答

Spring 默认的事务传播行为适合于什么情况呢?

2022-03-31 20:04:46 233浏览量 回答数 1

1

回答

Spring事务中有哪几种事务传播行为啊?

2022-03-31 19:15:50 219浏览量 回答数 1

3

回答

Spring 事务传播行为是什么?

2021-10-27 21:56:05 294浏览量 回答数 3

1

回答

spring事务传播行为propagation_nested是什么?

2021-10-19 21:50:21 297浏览量 回答数 1

1

回答

spring事务传播行为PROPAGATION_MANDATORY是什么?

2021-10-19 21:41:09 347浏览量 回答数 1

1

回答

spring事务传播行为PROPAGATION_NEVER是什么?

2021-10-19 21:43:58 306浏览量 回答数 1

1

回答

spring事务传播行为PROPAGATION_NOT_SUPPORTED是什么?

2021-10-19 21:42:55 609浏览量 回答数 1

1

回答

spring事务传播行为PROPAGATION_SUPPORTS是什么?

2021-10-19 21:39:48 294浏览量 回答数 1

1

回答

spring事务传播行为PROPAGATION_REQUIRED是什么?

2021-10-19 21:35:10 275浏览量 回答数 1

1

回答

spring事务传播行为PROPAGATION_REQUIRES_NEW是什么?

2021-10-19 21:42:06 280浏览量 回答数 1
+关注
文章
问答
问答排行榜
最热
最新
相关电子书
更多
Spring Cloud 微服务核心组件集 mica 的设计思路
立即下载
Data as a Service - 数据即服务 -- MongoDB⾼级应⽤模式
立即下载
Spring Cloud Alibaba - 重新定义 Java Cloud-Native
立即下载