而交易屬性的Propagation的意思是:MemberMgr.addMember (...)呼叫GroupMgr.checkGroup(...),之後又呼叫了RoleMgr.checkRole(...),這樣由 addMember()到checkGroup()是Propagation,而addMember()到checkRole()也是 Propagation,但是checkGroup()與checkRole()是沒有任何關聯的。
所以若是:
public void methodA() {
this.methodB();
this.methodC();
this.methodD();
}
可能的狀況是,若B不commit,那C的內容會受到影響,所以希望B、C與D為獨立的Transaction unit,也就是B執行完就commit,然後再執行C,C commit之後再執行D。
解法:
- A與BCD不能在同一MGR裡,因為this.methodX()是不會觸發AOP的交易管理的,所以A必須獨立成另一個MGR,BCD在另一個。
- methodA是不能有交易定義的,因為會影響Propagation。
- 而methodB, C, D的屬性只要是required就可以了,不就特別強調是requires new,因為A依序呼叫BCD,BCD之間的交易是沒有關聯的,BCD的交易只會與呼叫它們的method有關聯,也就是A,所以必須關閉A的交易。
public void methodA() {
this.getSomeMgr().methodB(); //PROPAGATION_REQUIRED
this.getSomeMgr().methodC(); //PROPAGATION_REQUIRED
this.getSomeMgr().methodD(); //PROPAGATION_REQUIRED
}
沒有留言:
張貼留言