相同類方法之間呼叫,註解失效的問題

2021-09-24 14:29:31 字數 787 閱讀 2512

問題:

在spring管理的專案中,方法a使用了transactional註解,試圖實現事務性。但當同乙個class中的方法b呼叫方法a時,會發現方法a中的異常不再導致回滾,也即事務失效了。

原因:transactional是spring提供的事務管理註解。

重點在於,spring採用動態**(aop)實現對bean的管理和切片,它為我們的每個class生成乙個**物件。只有在**物件之間進行呼叫時,可以觸發切面邏輯。(spring動態**詳情可戳:spring自動載入,使用實現類無法載入,使用介面卻可以的原因)

而在同乙個class中,方法b呼叫方法a,呼叫的是原物件的方法,而不通過**物件。所以spring無法切到這次呼叫,也就無法通過註解保證事務性了。

解決方法1:

將事務方法放到另乙個類中(或者單獨開啟一層,取名「事務層」)進行呼叫,即符合了在物件之間呼叫的條件。

解決方法2:

獲取本物件的**物件,再進行呼叫。具體操作如:

spring-content.xml上下文中,增加配置:

在***serviceimpl中,用(***service)(aopcontext.currentproxy()),獲取到***service的**類,再呼叫事務方法,強行經過**類,啟用事務切面。

解決方法3:

很多時候,方法內呼叫又希望啟用事務,是由於同乙個方法既有dao操作又有i/o等耗時操作,不想讓耗時的i/o造成事務的太長耗時(比如新增商品同時需要寫入庫存)。此時,可以將i/o做成非同步操作(如加入執行緒池),而加入執行緒池的操作即便加入事務也不會導致事務太長,問題可以迎刃而解。

Java中main函式呼叫同類中的方法

1 需要建立這個類的例項,再進行呼叫 publicclasstest voidtrain 2 直接呼叫,需要注意的是 train方法中不能缺少static。public classtest public static void train string param 總結 對於一般的非static成員...

C 測試對比不同型別的方法呼叫的效能

1.例項方法呼叫 2.靜態方法呼叫 3.例項方法反射呼叫 4.委託方法的invoke呼叫 5.委託方法的dynamicinvoke呼叫 6.委託方法的begininvoke呼叫 1.首先要先對測試 和測試工具的方法進行預熱處理,即先呼叫一次然方法通過jit編譯成本機的 防止其對時間的損耗 雖然只有一...

feign 請求呼叫執行緒之間的資訊丟失的問題

最近在工作中遇到了乙個這樣的問題,情景如下 在微服務兩個例項直接呼叫的時候會列印出一些日誌但是發現這些日誌的log id變了,正常來說應該是保持一致的,例項a呼叫b的時候發現log id是一致的,但是例項b呼叫a就不一致了,後來除錯了一下發現問題出在斷路器 hystrix 的隔離策略上,原來a的隔離...