spring事务调用另外一个事务方法,springboot事务控制几种方式

  spring事务调用另外一个事务方法,springboot事务控制几种方式

  00-1010多个服务相互调用的事务注释配置如下:Spring事务调用服务与服务之间的调用原理分析

  今天00-1010,我想在一个服务的方法A中调用另一个服务的方法B。方法A和B都有数据库插入操作,并且添加了@Transaction注释。但是,当方法B中抛出异常时,A中的insert语句仍然可以成功执行。

  00-1010 @ Transactional(isolation=isolation . default,propagation=propagation . required)受阻。查了相关资料,问题还是出在@Transaction注释的配置上,需要配置异常回滚。

  @ Transactional(isolation=isolation . default,propagation=propagation . required,rollback for=exception.class)这样,当方法B中抛出异常时,A中的操作也会回滚,事务起控制作用。

  00-1010同一类的不同方法。方法A没有@Transactional,方法B有@ transactional。a调用方法B,事务不起作用。

  

目录

spring在扫描beans时会扫描方法是否包含@Transactional注释。如果是,spring将为这个bean动态生成一个子类(即代理类,proxy)。代理类继承原始bean。

 

  此时,当调用这个带注释的方法时,它实际上是由代理类调用的,代理类将在它被调用之前启动事务。

  但是,如果这个带注释的方法被同一个类中的其他方法调用,那么该方法将通过原始bean而不是代理类直接调用,因此事务将不会启动。我们看到的是@Transactional注释无效。

  //接口接口服务{ void A();void B();}//目标类,实现接口类service impl实现service {//no annotation Here @ override public void A(){ this . b();} @ Transactional @ Override public void B(){ system . out . println( execute doNeedTx in service impl );} }//代理类,同一个接口类ProxyByJDKDDynamic Implements Service {//包含目标对象私有服务target;public ProxyByJdkDynamic(服务目标){ this.target=target}//该方法在目标类中注释特殊处理@Override public void B() {//打开事务system . out . println(-create tx here in proxy );//调用目标对象的方法,该对象具有目标。交易中的b()。//commit transaction system . out . println(-commit tx here in proxy );}//目标类中没有对这个方法的注释,只需简单调用@Override public void A() {//直接调用目标对象方法target即可。a();}}然后回到最初的问题。我们调用的方法A没有注释,所以代理类不打开事务,而是直接调用目标对象的方法。

  进入目标对象的方法后,执行上下文就变成了目标对象本身,因为目标对象的代码是我们自己写的,与事务无关。此时,如果再次调用带注释的方法,仍然不会有事务,只是一个普通的方法调用。

  简单来说,对这类方法的内部调用不会去代理,所以B的事务不起作用。

  以上个人经验,希望能给大家一个参考,也希望大家能支持盛行的IT。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: