最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

一、前言

1.Bean是否是代理對象

2.入口函數(shù)是否是public的

3.數(shù)據(jù)庫是否支持事務(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實現(xiàn),該子類方法中默認是true,所以當你加了事務注解的方法不是public時,該方法直接返回null

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

public導致失效原因

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

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

解決方案一:

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

解決方案二:

解決方案三:

使用編程式事務

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

拋出RuntimeException異常,事務生效

拋出Exception異常,事務不生效

我們看下TransactionInterceptor類

TransactionInterceptor#invoke

TransactionAspectSupport#invokeWithinTransaction

TransactionAspectSupport#completeTransactionAfterThrowing

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

五、異常被catch住

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

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

解決方案一:

catch之后往外拋異常

解決方案二:

catch之后,設置手動回滾

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

相關文章

  • Java中的ArrayList集合源碼解析

    Java中的ArrayList集合源碼解析

    這篇文章主要介紹了Java中的ArrayList集合源碼解析,ArrayList是一種以數(shù)組實現(xiàn)的List,與數(shù)組相比,它具有動態(tài)擴展的能力,因此也可稱之為動態(tài)數(shù)組,需要的朋友可以參考下
    2023-12-12
  • Maven Plugins報錯的解決方法

    Maven Plugins報錯的解決方法

    本文主要介紹了Maven Plugins報錯的解決方法,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-02-02
  • IDEA中使用jclasslib插件可視化方式查看類字節(jié)碼的過程詳解

    IDEA中使用jclasslib插件可視化方式查看類字節(jié)碼的過程詳解

    查看JAVA字節(jié)碼有兩種方式一種是使用 jdk命令 javap,還有一種就是 使用 插件了,今天給大家分享IDEA中使用jclasslib插件可視化方式查看類字節(jié)碼的過程詳解,感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • 結合mybatis-plus實現(xiàn)簡單不需要寫sql的多表查詢

    結合mybatis-plus實現(xiàn)簡單不需要寫sql的多表查詢

    這篇文章主要給大家介紹了關于結合mybatis-plus實現(xiàn)簡單不需要寫sql的多表查詢的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用mybatis-plus具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-09-09
  • springboot啟動報錯:application?startup?failed問題

    springboot啟動報錯:application?startup?failed問題

    這篇文章主要介紹了springboot啟動報錯:application?startup?failed問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Java使用ProcessBuilder?API優(yōu)化流程

    Java使用ProcessBuilder?API優(yōu)化流程

    Java?的?Process?API?為開發(fā)者提供了執(zhí)行操作系統(tǒng)命令的強大功能,這篇文章將詳細介紹如何使用?ProcessBuilder?API?來方便的操作系統(tǒng)命令,需要的可以收藏一下
    2023-06-06
  • Java自定義標簽用法實例分析

    Java自定義標簽用法實例分析

    這篇文章主要介紹了Java自定義標簽用法,結合實例形式分析了java自定義標簽的定義、使用方法與相關注意事項,需要的朋友可以參考下
    2017-11-11
  • SpringBoot2如何集成Elasticsearch6.x(TransportClient方式)

    SpringBoot2如何集成Elasticsearch6.x(TransportClient方式)

    這篇文章主要介紹了SpringBoot2如何集成Elasticsearch6.x(TransportClient方式)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Java RandomAccessFile 指定位置實現(xiàn)文件讀取與寫入

    Java RandomAccessFile 指定位置實現(xiàn)文件讀取與寫入

    這篇文章主要介紹了Java RandomAccessFile 指定位置實現(xiàn)文件讀取與寫入的相關資料,需要的朋友可以參考下
    2017-01-01
  • jdk中動態(tài)代理異常處理分析:UndeclaredThrowableException

    jdk中動態(tài)代理異常處理分析:UndeclaredThrowableException

    最近在工作中遇到了報UndeclaredThrowableException的錯誤,通過查找相關的資料,終于解決了,所以這篇文章主要給大家介紹了關于jdk中動態(tài)代理異常處理分析:UndeclaredThrowableException的相關資料,需要的朋友可以參考下
    2018-04-04

最新評論

松江区| 绥德县| 察隅县| 和顺县| 沁阳市| 托克托县| 石嘴山市| 新沂市| 民县| 汉阴县| 铁岭县| 锡林郭勒盟| 古田县| 济源市| 安福县| 古浪县| 营山县| 保靖县| 达拉特旗| 米林县| 宜丰县| 凯里市| 清镇市| 喀喇沁旗| 科尔| 西平县| 临海市| 托克逊县| 遂平县| 龙陵县| 宝丰县| 绥阳县| 香港| 乌审旗| 红河县| 安庆市| 玛多县| 苏尼特左旗| 东兴市| 吉首市| 临湘市|