目錄
情況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()開啟新的事務,資料源正常切換, 事務生效,并捕獲了自己的異常,如不進行捕獲,會影響主事物進行復原
此時三個事務之間互不影響
原因:
- 開啟事務的同時,會從資料庫連接配接池擷取資料庫連接配接(一個事務隻會有一個資料庫連接配接)
- 被調用的方法,使用了@DS會做一次aop切片,但是整個事務的連接配接是不會發生變更的,是以調用的資料源還是order
- 要使@DS起作用需要建立一個新的事務進而擷取一個新的資料庫連接配接