正如你多知道,當你代理的對象,當你爲春/ EJB創建事務屬性的bean或者甚至當你創建一些框架的部分模擬,該代理對象不知道,和內部通話都是這樣未進行重定向,再也不攔截...如何處理Spring/EJB/Mockito ...代理上的內部調用?
這就是爲什麼,如果你做這樣的事情在春天:
@Transactionnal
public void doSomething() {
doSomethingInNewTransaction();
doSomethingInNewTransaction();
doSomethingInNewTransaction();
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void doSomethingInNewTransaction() {
...
}
當你調用DoSomething的,你希望有除主3個新的交易一個,但實際上,由於這個問題,你只能得到一個...
所以我不知道你怎麼做才能處理這些類型的問題...
我其實是在一個情況下,我必須處理複雜的交易系統,和我沒有看到比什麼更好的辦法把我的服務分成許多小服務,這樣我肯定能夠通過所有的代理...
困擾我很多,因爲所有的代碼屬於相同的功能域,不應該分裂...
我發現這個相關的問題有趣的答案: Spring - @Transactional - What happens in background?
羅布^ h說,我們可以注入裏面的服務春季代理,並調用proxy.doSomethingInNewTransaction();代替。 這是很容易做到,它的工作原理,但我真的不喜歡它...
雲峯侯這樣說:
所以,我寫我自己的CglibSubclassingInstantiationStrategy的版本和 代理創建者,這樣它將使用CGLIB來生成一個真實的子類 ,這個子類委託調用它的超級實例,而不是另一個實例,Spring現在正在這樣做。因此,我可以自由註釋任何方法(只要它不是私人的,只要 ),並且從我稱之爲這些方法的任何地方,他們將會照顧到它們 。那麼,我仍然有支付的代價:1.我必須列出 所有註釋,我希望啓用新的CGLIB子類 創建。 2.由於我現在是 生成子類,所以我不能在最終的方法上註釋,所以最終的方法不能被截取。
他對我們「這春現在正在做」是什麼意思?這是否意味着內部交易呼叫現在被攔截?
你認爲哪個更好?
你分割你的類時,你需要一些事務性的粒度? 或者您是否使用上述的一些解決方法? (請分享)
沒有更多的想法?請確認您已經看到此問題 –