声明式事务基于注解@Transactional的理解
事務分為編程式事務 與 聲明式事務 這里描述常用的聲明式事務的原理。
@Transactional?實現機制:
當在方法上使用@Transactional 時,Spring Framework 默認使用 AOP 代理,在代碼運行時生成一個代理對象,根據@Transactional 的屬性配置信息,這個代理對象決定該聲明@Transactional 的目標方法是否由攔截器 TransactionInterceptor 來使用攔截,在 TransactionInterceptor 攔截時,會在在目標方法開始執行之前創建并加入事務,并執行目標方法的邏輯, 最后根據執行情況是否出現異常決定提交或回滾事務。
@Transactional 中相關參數說
name? ? ? :當在配置文件中有多個 TransactionManager , 可以用該屬性指定選擇哪個事務管理器。
propagation :事務的傳播行為,默認值為 REQUIRED。
isolation? ? ?:事務的隔離度,默認值采用 DEFAULT。
timeout? ? ? ? ? ? ?:事務的超時時間,默認值為-1。如果超過該時間限制但事務還沒有完成,則自動回滾事務。
read-only? :指定事務是否為只讀事務,默認false 為了忽略那些不需要事務的方法,如讀取數據可以設置read-only為true。
rollback-for? ? ? :用于指定能夠觸發事務回滾的異常類型,如果有多個異常類型需要指定,各類型之間可以通過逗號分隔。
no-rollback- for:拋出 no-rollback-for 指定的異常類型,不回滾事務。
(重點說明)propagation : 事務的傳播行為?
Propagation.REQUIRED(默認):如果當前存在事務,則加入該事務,如果當前不存在事務,則創建一個新的事務。
Propagation.SUPPORTS:如果當前存在事務,則加入該事務;如果當前不存在事務,則以非事務的方式繼續運行。
Propagation.MANDATORY:如果當前存在事務,則加入該事務;如果當前不存在事務,則拋出異常。
Propagation.REQUIRES_NEW:重新創建一個新的事務,如果當前存在事務,暫停當前的事務。
Propagation.NOT_SUPPORTED:以非事務的方式運行,如果當前存在事務,暫停當前的事務。
Propagation.NEVER:以非事務的方式運行,如果當前存在事務,則拋出異常。
Propagation.NESTED: Propagation.REQUIRED 效果一樣。
?
不會執行事務的場景:懂原理才能知道為什么不執行!!
為什么不啟用事務的排查邏輯:
1、public:SpringAOP中涉及的核心類CglibAopProxy 或者 JdkDynamicAopProxy 無法獲取@Transactional 的相關配置,底層使用反射讀取配置信息,但該方法非Public 所以獲取不到。
2、try/catch:核心類找到了你@Transactional 的配置,但你在方法里catch 掉了,所以事務攔截器攔截的時候抓不到異常導致無法回滾
3、同類中自調用:找到了,也沒有catch.但還是沒有回滾,看看是不是在同一個類中形成了自調用(同類中方法事務A調用事務方法B)這里可以參考IBM的這個博客
4、propagation:找到沒也沒catch也無自調用,檢查Propagation 參數是否配置了不啟用事務的參數
5、回滾異常檢測:檢查rollbackFor 以及?noRollbackFor 這里檢查的異常是否有問題。
?
?
參考文章:
https://blog.csdn.net/nextyu/article/details/78669997? 《Spring Boot 中使用 @Transactional 注解配置事務管理》
https://www.ibm.com/developerworks/cn/java/j-master-spring-transactional-use/index.html?《透徹的掌握 Spring 中@transactional 的使用》
https://docs.spring.io/spring/docs/4.3.13.RELEASE/spring-framework-reference/htmlsingle/#transaction-declarative-annotations
《Spring框架參考文檔》
轉載于:https://www.cnblogs.com/lanSeGeDiao/p/10919415.html
總結
以上是生活随笔為你收集整理的声明式事务基于注解@Transactional的理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 恋与制作人羁绊进化
- 下一篇: Spring系列教程八: Spring实