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

使用Spring事物時不生效的場景及解決方法

 更新時間:2023年09月05日 11:10:05   作者:劉牌  
今天介紹一下Spring事物不生效的場景,事物是我們在項目中經(jīng)常使用的,如果是Java的話,基本上都使用Spring的事物,不過Spring的事物如果使用不當(dāng),那么就會導(dǎo)致事物失效或者不回滾,最終導(dǎo)致數(shù)據(jù)不一致,下面我們意義列舉不生效的場景,并給出解決方法

一.類沒被Spring管理

如果我們的類沒有被Spring管理,那么即使使用了Spring事物也不會生效,要讓Spring管理我們的類,需要標(biāo)注@Component,@Service等注解。

二.沒有標(biāo)注@Transactional注解的方法調(diào)用了標(biāo)注@Transactional注解的方法

如果一個方法沒有使用@Transactional注解,但是它去調(diào)用了帶@Transactional注解的方法,那么當(dāng)前方法的事物不生效。

    public void saveUser(User user) throws Exception {
        save(user);
    }
    @Transactional(rollbackFor = Exception.class)
    public void save(User user) {
        try {
            userDao.save(user);
            exceptionMethod();
            roleService.save(user.getRole());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

如上所示,saveUser方法調(diào)用了save方法,但是saveUser沒有標(biāo)@Transactional注解,而它調(diào)用了save方法,save方法標(biāo)了@Transactional,不過事物不會生效,這是因為方法沒被代理,直接是普通方法調(diào)用,所以事物自然不生效。

如果一個方法中調(diào)用了其他方法,需要在主方法上加@Transactional注解這個方法才能被代理,如下代碼,當(dāng)然,遠(yuǎn)程調(diào)用@Transactional就不生效了,就需要分布式事物了。

    @Transactional(rollbackFor = Exception.class)
    public void saveAnnotation(User user) throws Exception {
        save(user);
    }
    public void save(User user) {
        try {
            userDao.save(user);
            exceptionMethod();
            roleService.save(user.getRole());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

三.異常使用不正確

如果異常使用不當(dāng),那么事物也不會生效,這里的異常有兩種,一種是我們拋出的異常,一種是@Transactional注解所接受的異常。

1.如果我們在程序代碼中自己捕獲了異常導(dǎo)致Spring事物捕獲不到異常,那么事物也不會生效,如下,exceptionMethod方法捕獲了異常并打印異常信息,那么異常并不會被Spring事物捕獲到,所以事物并不會回滾。

    @Transactional(rollbackFor = Exception.class)
    public void saveAnnotation(User user) throws Exception {
        userDao.save(user);
        exceptionMethod();
        roleService.save(user.getRole());
    }
    private void exceptionMethod() throws Exception {
        try {
            int i = 1 / 0;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

如果需要事物回滾,那么就需要將異常拋到saveAnnotation方法,這樣Spring事物才能感知到異常,從而進(jìn)行事物回滾。

2.@Transactional注解有一個屬性rollbackFor,它代表回滾的異常,也就是說只有捕獲到這種異常事物才會回滾,它默認(rèn)的是RunTimeException。

    @Transactional
    public void saveAnnotation(User user) throws Exception {
        userDao.save(user);
        exceptionMethod();
        roleService.save(user.getRole());
    }
    private void exceptionMethod() throws Exception {
        try {
            int i = 1 / 0;
        } catch (Exception e) {
            throw new Exception("拋出異常");
        }
    }

如上代碼,exceptionMethod方法拋出了Exception異常,而@Transactional注解我們沒有指定rollbackFor,所以使用的是默認(rèn)的RunTimeException,所以事物不能回滾,如果我們需要事物回滾,需要讓rollbackFor指定的異常是拋出異常的父類或者和自己一樣才行,如下所示。

    @Transactional(rollbackFor = Exception.class)
    public void saveAnnotation(User user) {
        userDao.save(user);
        exceptionMethod();
        roleService.save(user.getRole());
    }
    private void exceptionMethod() {
        try {
            int i = 1 / 0;
        } catch (Exception e) {
            throw new ArithmeticException("運算異常");
        }
    }

四.不正確的傳播行為

如果傳播行為使用的是NOT_SUPPORTED,那么事物無法回滾。NOT_SUPPORTED表示當(dāng)前方法不應(yīng)該有事務(wù),如果有事務(wù)存在,將它掛起,以無事務(wù)狀態(tài)運行。

@Transactional(propagation = Propagation.NOT_SUPPORTED)

五.方法修飾為private

如果方法以private修飾,那么方法將不會被代理,事物自然不會生效,不過如果在進(jìn)行業(yè)務(wù)開發(fā)的時候,對于需要其它類進(jìn)行調(diào)用的方法,我們都是以public修飾,因為如果以private修飾,其它類想要訪問的話需要借助反射才能訪問,在IDEA中,@Transactional方法如果修飾為private,會有錯誤提醒,但是運行不會報錯。

不過一些場景我們可能需要反射調(diào)用,所以不應(yīng)該避開這個問題,還是將其修飾為public。

六.數(shù)據(jù)庫不支持事物

如果數(shù)據(jù)庫不支持事物,那么即使項目中使用了Spring事物,也不會生效,因為Spring的事物最終也是JDBC的事物,JDBC事物也要數(shù)據(jù)庫支持事物才行,MySQL中MyISAM存儲引擎不支持事物,InnoDB才支持事物。

七.沒有配置事務(wù)管理器,導(dǎo)致事務(wù)失效

使用非SpringBoot項目,需要配置PlatformTransactionManager,需要加上@EnableTransactionManagement注解,如果是SpringBoot項目,那么可以不用配置,因為SpringBoot默認(rèn)幫我們裝配好了,我們直接使用就好。

以上就是使用Spring事物時不生效的場景及解決方法的詳細(xì)內(nèi)容,更多關(guān)于使用Spring事物時不生效的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java super關(guān)鍵字用法實戰(zhàn)案例分析

    Java super關(guān)鍵字用法實戰(zhàn)案例分析

    這篇文章主要介紹了Java super關(guān)鍵字用法,結(jié)合具體案例形式分析了java super關(guān)鍵字調(diào)用父類構(gòu)造方法、屬性及方法等相關(guān)操作技巧與注意事項,需要的朋友可以參考下
    2019-09-09
  • Spring超出最大會話數(shù)(Max?sessions?limit?reached:?10000)

    Spring超出最大會話數(shù)(Max?sessions?limit?reached:?10000)

    在Spring系統(tǒng)中遇到的Maxsessionslimitreached:10000錯誤,該錯誤由于會話數(shù)超過默認(rèn)限制10000而觸發(fā),下面就來介紹一下解決方法,感興趣的可以了解一下
    2024-12-12
  • 基于JWT的spring boot權(quán)限驗證技術(shù)實現(xiàn)教程

    基于JWT的spring boot權(quán)限驗證技術(shù)實現(xiàn)教程

    這篇文章主要給大家介紹了關(guān)于基于JWT的spring boot權(quán)限驗證技術(shù)實現(xiàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Java?將HTML轉(zhuǎn)為XML的詳細(xì)步驟

    Java?將HTML轉(zhuǎn)為XML的詳細(xì)步驟

    這篇文章主要介紹了Java?將HTML轉(zhuǎn)為XML,本文將以html轉(zhuǎn)為xml格式為例,介紹如何實現(xiàn)轉(zhuǎn)換,以下是詳細(xì)方法及步驟,需要的朋友可以參考下
    2022-06-06
  • Intelli IDEA安裝Scala插件并安裝Scala軟件和配置環(huán)境變量的詳細(xì)教程

    Intelli IDEA安裝Scala插件并安裝Scala軟件和配置環(huán)境變量的詳細(xì)教程

    這篇文章主要介紹了Intelli IDEA安裝Scala插件并安裝Scala軟件和配置環(huán)境變量的詳細(xì)教程,需要的朋友可以參考下
    2020-10-10
  • Netty與NIO超詳細(xì)講解

    Netty與NIO超詳細(xì)講解

    Netty本質(zhì)上是一個NIO的框架,適用于服務(wù)器通訊相關(guān)的多種應(yīng)用場景。底層是NIO,NIO底層是Java?IO和網(wǎng)絡(luò)IO,再往下是TCP/IP協(xié)議,下面我們跟隨文章來詳細(xì)了解
    2022-08-08
  • SpringCloud可視化鏈路追蹤系統(tǒng)Zipkin部署過程

    SpringCloud可視化鏈路追蹤系統(tǒng)Zipkin部署過程

    這篇文章主要介紹了SpringCloud可視化鏈路追蹤系統(tǒng)Zipkin部署過程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • java 排序算法之快速排序

    java 排序算法之快速排序

    這篇文章主要介紹了java 排序算法之快速排序,文中通過圖片和代碼講解相關(guān)知識非常詳細(xì),大家如果有需要的話可以參考一下這篇文章
    2021-09-09
  • 基于SpringBoot實現(xiàn)上傳2種方法工程代碼實例

    基于SpringBoot實現(xiàn)上傳2種方法工程代碼實例

    這篇文章主要介紹了基于SpringBoot實現(xiàn)上傳工程代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • 詳解Java中的checked異常和unchecked異常區(qū)別

    詳解Java中的checked異常和unchecked異常區(qū)別

    這篇文章主要介紹了詳解Java中的checked異常和unchecked異常區(qū)別,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02

最新評論