問題
a方法,b方法,都通過aop加上了事物控制,a中呼叫了b方法,那麼一共幾次事物
準備
1.建立資料庫
-- 建立資料庫
use test;
-- 建表
create table account(
id int not null auto_increment,
name varchar(20) not null ,
money double not null
);insert into account(id,name,money) value
(1,"aaa",1000),
(1,"bbb",1000),
(1,"ccc",1000)
2.xml配置,例項化了兩個 service 類,乙個dao類,開啟事務註解驅動
3.dao 類
public class accountdaoimpl extends jdbcdaosupport implements accountdao
@override
public void reduce(string name, double money)
}
4.service 類
// service 1
public class accountserviceimpl implements accountservice catch (exception e)
}public void add(string to, double money)
public void reduce(string to, double money)
}// service 2
public class accountserviceimpl2
}
5.測試類
@runwith(springjunit4classrunner.class)
public class testservice
}
測試1.當 a , b 方法在同乙個類中時,兩個方法的 事務傳播行為都設定為propagation.required
即accountserviceimpl 中transfer 的內容為
@transactional(propagation = propagation.required, readonly = false)
@override
public void transfer(string from, string to, double money) catch (exception e)
}
accountserviceimpl 中reduce 的內容為
@transactional(propagation = propagation.required, readonly = false)
public void reduce(string to, double money)
測試結果:
當設定accountserviceimpl 中transfer 的傳播行為是propagation.required,accountserviceimpl 中reduce 的傳播行為是requires_new 時,
測試結果:
2.當 a , b 方法不在同乙個類中時,兩個方法的 事務傳播行為都設定為propagation.required
即accountserviceimpl 中transfer 的內容為
@transactional(propagation = propagation.required, readonly = false)
@override
public void transfer(string from, string to, double money) catch (exception e)
}
accountserviceimpl2 中reduce 的內容為
@transactional(propagation = propagation.required, readonly = false)
public void reduce(string to, double money)
測試結果:
當設定accountserviceimpl 中transfer 的傳播行為是propagation.required,accountserviceimpl2 中reduce 的傳播行為是propagation.requires_new 時,
測試結果:
總結:
1.當a,b方法在同乙個類中時,不管 b 方法設定何種 傳播行為,a,b方法都共用乙個事務(具體實現方式還未深究)。
2.當a,b方法不在同乙個類中時,事務的傳播行為看 b 方法的註解配置,b 方法配置 propagation.required 是,與a方法共用事務,
當 b 中產生異常,b 方法把 事務 標記 為回滾,然後把異常拋給 a 方法,a 方法對異常進行了捕獲,所以 a 方法內無異常,a方法會 對事務 進行提交操作,但是b 方法已經把 該事務 標記為 回滾,所以 會丟擲異常。解決這個的辦法就是把 b 方法配置為 propagation.requires_new,這樣 b 方法會產生新的 事務,結果就是 b 的事務回滾,a 的事務正常提交
但是對於該部落格的分析中,我還是有點疑問 :
博文中說 當呼叫本類方法時,此時的 this 是指向被**的物件的
測試確實如此,那為什麼不是 指向 spring 生成的**類呢?
希望知道的朋友能知導一二,謝謝!
又找到了兩個說的很透徹的鏈結了!
jdk 動態**
jdkdynamicaopproxy 類的invoke方法
cglib動態**
cglibaopproxy 類中設定了callback 為 dynamicadvisedinterceptor 類
我們配置的 aop 切面,實際是以責任鏈的方式執行的,然後呼叫的*被**的物件*執行響應的方法,所以在方法中斷點檢視this物件,發現不是**物件,就是當前的類。 Service 呼叫 Service方法 事務失效
情況1 介面方法沒有新增 transactional 註解,事務不會開啟,如果該方法體內呼叫其他有事務的方法時,且呼叫方法為this.method 時,那麼被呼叫的方法即使新增了 transactional 註解 也不會有事務產生 如呼叫方法1 情況2 介面方法沒有新增 transactional ...
SpringBoot 類中方法呼叫方法事務失效問題
sevice public class test transactional public void b 此時事務時不生效的,因為 transactional註解事務是通過 來控制的,方法呼叫本類方法,事務不會生效。解決方法 增加該註解開啟 enableaspectjautoproxy proxyt...
初探類的字段 屬性 方法 事件
tmyevent procedure of object tmyclass class private fage integer fonhundred tmyevent procedure setage const value integer public procedure setonhundre...