2006-04-02

[Gain] Spring AOP Transaction

使用Spring的宣告式交易管理時,可以為Interface裡的每個method定義交易屬性,這裡要強調的重點是Interface,定義是在Interface上,並非Interface的Implementation上,所以 Controller呼叫MemberMgr的addMember(...)時,是有受到AOP管理的,假設在Implementation的 addMember(...)裡直接呼叫this.updateMemberCode(...),這樣對updateMemberCode(...)的 AOP交易設定是不起作用的,因為呼叫並未透過Interface,所以AOP並不知情。

而交易屬性的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的交易。
// no transaction
public void methodA() {
this.getSomeMgr().methodB(); //PROPAGATION_REQUIRED
this.getSomeMgr().methodC(); //PROPAGATION_REQUIRED
this.getSomeMgr().methodD(); //PROPAGATION_REQUIRED
}

沒有留言:

張貼留言