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...