天天看點

@DS(mybatis-plus)事務傳播關系情況i: 主方法開啟事務情況ii: 子方開啟事物情況iii: 主方法開啟事務/子方法建立事務原因:

目錄

情況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起作用需要建立一個新的事務進而擷取一個新的資料庫連接配接

繼續閱讀