问题如题,本人使用的是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方法结束,才为一个完整的事务。
你insert*方法中的异常未抛出,spring不知道发生了异常。
未抛出的原因是在catch中使用了return语句,导致异常无法抛出insert*方法之外。
一般是绝对禁止在catch 和finally中使用return语句的。主要是会丢失掉抛出的异常。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。