目录

情况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起作用需要创建一个新的事务从而获取一个新的数据库连接
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐