@DS(mybatis-plus)事务传播关系

目录

情况i: 主方法开启事务

情况ii: 子方开启事物

情况iii: 主方法开启事务/子方法新建事务

原因:


情况i: 主方法开启事务

class ALL{
    @Transaction(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    @DS("order")
    all(){

        do sql all~1;
        
        @DS("customer")
        A.a(){
            do sql 1;
                // 1/0;
            do sql 2;
        };
        @Ds("warehouse")
        B.b(){
            do sql 3;
                // 1/0;
            do sql 4;
        };

        do sql all~2;
    }
}

all()开启了事务

A.a() 没有事务,数据源失效,访问order数据源(表不存在会报错)

B.b() 没有事务,数据源失效,访问order数据源(表不存在会报错)

情况ii: 子方开启事物

class ALL{
    // @Transaction(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    @DS("order")
    all(){

        do sql all~1;
    
        @Transaction(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
        @DS("customer")
        A.a(){
            do sql 1;
                // 1/0;
            do sql 2;
        };
        @Transaction(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
        @Ds("warehouse")
        B.b(){
            do sql 3;
                // 1/0;
            do sql 4;
        };

        do sql all~2;
    }
}

all()没有事务

A.a()是一个事务,数据源正常切换, 事务生效

B.b()是一个事务,数据源正常切换, 事务生效

相互之间没有影响

情况iii: 主方法开启事务/子方法新建事务

class ALL{
    @Transaction(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    @DS("order")
    all(){

        do sql all~1;

        try{
            @Transaction(propagation=Propagation.REQUIRES_NEW, rollbackFor = Exception.class
        	@DS("customer")
        	A.a(){
        	    do sql 1;
        	        // 1/0;
        	    do sql 2;
        	};    
        }catch(){
            
        }
        
        try{
            @Transaction(propagation=Propagation.REQUIRES_NEW, rollbackFor = Exception.class
        	@Ds("warehouse")
        	B.b(){
            	do sql 3;
                	// 1/0;
            	do sql 4;
        	};    
        }catch(){
            
        }
        

        do sql all~2;
    }
}

all()开启事物主事务

A.a()开启新的事务,数据源正常切换, 事务生效,并捕获了自己的异常,如不进行捕获,会影响主事物进行回滚

B.b()开启新的事务,数据源正常切换, 事务生效,并捕获了自己的异常,如不进行捕获,会影响主事物进行回滚

此时三个事务之间互不影响

原因:

  1. 开启事务的同时,会从数据库连接池获取数据库连接(一个事务只会有一个数据库连接)
  2. 被调用的方法,使用了@DS会做一次aop切片,但是整个事务的连接是不会发生变更的,所以调用的数据源还是order
  3. 要使@DS起作用需要创建一个新的事务从而获取一个新的数据库连接
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值