欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

從Spring源碼解析事務失效的原因

 更新時間:2021年06月08日 08:53:02   作者:星夜孤帆  
今天帶大家學習Spring的相關知識,文章圍繞著Spring事務失效的原因等相關知識展開,文中有非常詳細的介紹及圖文示例,需要的朋友可以參考下

一、前言

1.Bean是否是代理對象

2.入口函數是否是public的

3.數據庫是否支持事務(Mysql的Mvlsam不支持事務),行鎖才支持事務

4.切點是否配置正確

5.內部方法間調用導致事務失效

因為this不是代理對象,可以配置 expose-proxy="true",就可以通過AopContext.currentProxy()獲取到當前類的代理對象。

<! -- expose-proxy="true”類內部可以獲取到當前類的代理對象--><aop: aspectj-autoproxy expose-proxy="true" />
@Enab1eAspect3AutoProxy(exposeProxy = true)

也可以注入當前bean

6.異常類型是否配置正確

默認只支持RuntimeException和Error,不支持檢查異常

想要支持檢查異常需要配置rollbackFor

@Transactional(rollbackFor = Exception.class)

7.異常被catch住了

代碼中手動catch了異常,然后又未拋出來,此時事務就不生效了。

二、方法不是 public 的

以下來自Spring官方文檔

大概意思就是 @Transactional 只能用于 public 的方法上,否則事務不會失效,如果要用在非 public 方法上,可以開啟 AspectJ 代理模式。

Spring事務失效8大原因、事務失效原因

TransactionInterceptor#invoke

TransactionAspectSupport#invokeWithinTransaction

AbstractFallbackTransactionAttributeSource#getTransactionAttribute

AbstractFallbackTransactionAttributeSource#computeTransactionAttribute

allowPublicMethodsOnly方法由子類AnnotationTransactionAttributeSource實現,該子類方法中默認是true,所以當你加了事務注解的方法不是public時,該方法直接返回null

以上只說明 在spring的事務管理中存在這樣一個 public的判斷,至于后邊為啥由于這個判斷導致沒有織入事務,并沒有說明;

public導致失效原因

三、內部方法間調用導致事務失效

因為spring聲明式事務是基于AOP實現的,是使用動態(tài)代理來達到事務管理的目的,當前類調用的方法上面加@Transactional 這個是沒有任何作用的,因為調用這個方法的是this,沒有經過 Spring 的代理類。

解決方案一:

再聲明一個service,自己注入自己,將內部調用改為外部調用

解決方案二:

解決方案三:

使用編程式事務

四、異常類型是否配置正確

拋出RuntimeException異常,事務生效

拋出Exception異常,事務不生效

我們看下TransactionInterceptor類

TransactionInterceptor#invoke

TransactionAspectSupport#invokeWithinTransaction

TransactionAspectSupport#completeTransactionAfterThrowing

配置了這個,Exception異常的事務,就會生效

五、異常被catch住

代碼中手動catch了異常,然后又未拋出來,此時事務就不生效了。

解決方法:要么不catch需要回滾的異常,要么catch之后再拋出,要么手動回滾

解決方案一:

catch之后往外拋異常

解決方案二:

catch之后,設置手動回滾

到此這篇關于從Spring源碼解析事務失效的原因的文章就介紹到這了,更多相關Spring事務失效內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java實現字符串like和not?like的使用示例

    java實現字符串like和not?like的使用示例

    在Java中,我們經常需要對字符串進行模式匹配操作,字符串的模式匹配通常使用like和not?like這兩個運算符進行,本文就來介紹一下如何實現,感興趣的可以了解一下
    2023-09-09
  • java 多線程饑餓現象的問題解決方法

    java 多線程饑餓現象的問題解決方法

    這篇文章主要介紹了java 多線程饑餓現象的問題解決方法的相關資料,需要的朋友可以參考下
    2017-06-06
  • mybatis plus表的創(chuàng)建時間和修改時間的操作方法

    mybatis plus表的創(chuàng)建時間和修改時間的操作方法

    這篇文章主要介紹了mybatis plus表的創(chuàng)建時間和修改時間的實現方法,本文給大家分享兩種方法,每種方法通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2021-09-09
  • spring Boot查詢數據分頁顯示的方法實例

    spring Boot查詢數據分頁顯示的方法實例

    這篇文章主要給大家介紹了關于spring Boot查詢數據分頁顯示的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用spring Boot具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2020-08-08
  • Java實現鎖定某個變量的幾種方式示例詳解

    Java實現鎖定某個變量的幾種方式示例詳解

    這篇文章主要為大家介紹了Java實現鎖某個變量的幾種方式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • Java8新特性之新日期時間庫的使用教程

    Java8新特性之新日期時間庫的使用教程

    這篇文章主要給大家介紹了關于Java8新特性之新日期時間庫使用的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • 深入淺析Spring 中的Null-Safety

    深入淺析Spring 中的Null-Safety

    Spring Framework 本身利用了上面這幾個注釋,但它們也可以運用在任何基于Spring的Java 項目中,以聲明空安全api 和 空安全字段。這篇文章主要介紹了Spring 中的Null-Safety相關知識 ,需要的朋友可以參考下
    2019-06-06
  • Spring Boot中的那些條件判斷的實現方法

    Spring Boot中的那些條件判斷的實現方法

    這篇文章主要介紹了Spring Boot中的那些條件判斷的實現方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • 關于java后端的詳解

    關于java后端的詳解

    在本篇文章里小編給各位分享的是關于java后端的知識點詳解,學習java的朋友們可以參考下。
    2019-08-08
  • 深入分析JAVA流程控制語句

    深入分析JAVA流程控制語句

    這篇文章主要介紹了JAVA流程控制語句的的相關資料,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-06-06

最新評論