spring 註解 事務,宣告事務混用 解決問題

2021-10-07 22:56:03 字數 1923 閱讀 3344

xml 事務和註解事務最好不要一起 坑太多了,乙個aop中 存在兩個 org.springframework.transaction.interceptor.transactioninterceptor 而且各鐘情況錯中複雜,如果兩個是 propagation.propagation_required,propagation.requires_new 不同的順序特別是異常產生的時候會造成不同的影響

propagation.propagation_required -> propagation.requires_new (異常)

如果呼叫者為 propagation.propagation_required 沒有開啟 globalrollbackonparticipationfailure 那麼區域性異常,導致全域性回滾。

propagation.requires_new -> propagation.propagation_required(異常)

如果呼叫者為 propagation.propagation_required 沒有開啟 globalrollbackonparticipationfailure,由於內層事務使用了上乙個事務propagation.requires_new,相對於這個方法是乙個新的事務,呼叫者捕獲異常不會影響事務。

這個僅僅是兩種不同隔離級別的分析,其他的場景會出現什麼樣的么蛾子未知。

最好的方式是只有乙個最近看同事配置的, 如果存在註解那麼 xml 配置的就不生效,簡單了事

<

aop:config

>

<

aop:pointcutid=

"ao_bo"

expression

=/>

<

aop:advisor

pointcut-ref

="ao_bo"

advice-ref

="defaulttxadvice"

/>

aop:config

>

globalrollbackonparticipationfailure 讓主事務決定回滾

"transactionmanager"

class

="org.springframework.jdbc.datasource.datasourcetransactionmanager"

>

name

="datasource"

ref="datasource"

/>

name

="globalrollbackonparticipationfailure"

value

="false"

/>

bean

>

因此在同乙個事務中,區域性異常了,是否回滾有呼叫者決定,如果都捕獲異常了可以不用回滾,這個看自己的需求是否新增這個配置。

org.springframework.transaction.unexpectedrollbackexception: transaction rolled back because it has been marked as rollback-only 不然會丟擲這個異常。

servicea 

catch

(exception e)

}}

serviceb

}

新增乙個兩個xml 註解共存的***圖

最好的方式,有註解沒有xml,只要乙個即可,有他沒有我

系列文章一: spring 註解 事務,宣告事務共存—有bug

系列文章二:spring 註解 事務,宣告事務混用–解決問題

系列文章三:spring 事務採坑-xml註解 事務混用

系列文章四: spring 事務背後的故事

更多汪小哥

SPRING註解事務管理

quote 大家在使用spring的註解式事務管理時,對事務的傳播行為和隔離級別可能有點不知所措,下邊就詳細的介紹下以備方便查閱。事物註解方式 transactional 當標於類前時,標示類中所有方法都進行事物處理 例子 transactional public class testservice...

spring註解事務傳播行為

在 service 類前加上 transactional 宣告這個 service 所有方法需要事務管理。每乙個業務方法開始時都會開啟乙個事務。spring 預設情況下會對執行期例外 runtimeexception 進行事務回滾。這個例外是 unchecked 如果遇到 checked 意外就不回...

Spring使用註解實現事務 宣告事務

目標 通過事務,使以下方法要麼全成功 要麼全失敗。public void addstudent 一 新增jar包 事務jar包 spring tx.release.jar 資料庫驅動jar包 ojdbc.jar 連線池jar包 commons pool.jar 連線池使用到的資料來源 commons...