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

使用Spring事物時(shí)不生效的場(chǎng)景及解決方法

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

一.類沒被Spring管理

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

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

如果一個(gè)方法沒有使用@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,不過事物不會(huì)生效,這是因?yàn)榉椒]被代理,直接是普通方法調(diào)用,所以事物自然不生效。

如果一個(gè)方法中調(diào)用了其他方法,需要在主方法上加@Transactional注解這個(gè)方法才能被代理,如下代碼,當(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),那么事物也不會(huì)生效,這里的異常有兩種,一種是我們拋出的異常,一種是@Transactional注解所接受的異常。

1.如果我們?cè)诔绦虼a中自己捕獲了異常導(dǎo)致Spring事物捕獲不到異常,那么事物也不會(huì)生效,如下,exceptionMethod方法捕獲了異常并打印異常信息,那么異常并不會(huì)被Spring事物捕獲到,所以事物并不會(huì)回滾。

    @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注解有一個(gè)屬性rollbackFor,它代表回滾的異常,也就是說只有捕獲到這種異常事物才會(huì)回滾,它默認(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("運(yùn)算異常");
        }
    }

四.不正確的傳播行為

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

@Transactional(propagation = Propagation.NOT_SUPPORTED)

五.方法修飾為private

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

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

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

如果數(shù)據(jù)庫(kù)不支持事物,那么即使項(xiàng)目中使用了Spring事物,也不會(huì)生效,因?yàn)镾pring的事物最終也是JDBC的事物,JDBC事物也要數(shù)據(jù)庫(kù)支持事物才行,MySQL中MyISAM存儲(chǔ)引擎不支持事物,InnoDB才支持事物。

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

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

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

相關(guān)文章

  • Spring Boot 3.x 整合Swagger的示例教程

    Spring Boot 3.x 整合Swagger的示例教程

    本文給大家介紹Spring Boot 3.x 整合Swagger的示例教程,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2025-06-06
  • Spring框架中@PostConstruct注解詳解

    Spring框架中@PostConstruct注解詳解

    在Spring項(xiàng)目經(jīng)常遇到@PostConstruct注解,下面這篇文章主要給大家介紹了關(guān)于Spring框架中@PostConstruct注解的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • idea中ctrl+shift+f(在文件中查找)失效問題及解決過程

    idea中ctrl+shift+f(在文件中查找)失效問題及解決過程

    這段描述主要講解了解決Win1微軟鍵盤在Idea中按鍵無效的問題,以及搜狗輸入法簡(jiǎn)繁體切換快捷鍵的關(guān)閉方法,幫助用戶優(yōu)化輸入體驗(yàn)
    2026-05-05
  • Struts2實(shí)現(xiàn)單文件或多文件上傳功能

    Struts2實(shí)現(xiàn)單文件或多文件上傳功能

    這篇文章主要為大家詳細(xì)介紹了Struts2實(shí)現(xiàn)單文件或多文件上傳功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • 一篇文章帶你深入了解Java基礎(chǔ)(3)

    一篇文章帶你深入了解Java基礎(chǔ)(3)

    這篇文章主要給大家介紹了關(guān)于Java中方法使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • java 中枚舉類enum的values()方法的詳解

    java 中枚舉類enum的values()方法的詳解

    這篇文章主要介紹了java 中枚舉類enum的values()方法的詳解的相關(guān)資料,希望通過本文大家能夠掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-09-09
  • Java鎖機(jī)制完整學(xué)習(xí)筆記(附詳細(xì)代碼)

    Java鎖機(jī)制完整學(xué)習(xí)筆記(附詳細(xì)代碼)

    Java中的鎖機(jī)制是并發(fā)編程的核心工具之一,通過合理使用鎖、、讀寫鎖和自旋鎖,開發(fā)者可以確保多線程環(huán)境下的數(shù)據(jù)一致性和程序正確性,這篇文章主要介紹了Java鎖機(jī)制完整學(xué)習(xí)的相關(guān)資料,需要的朋友可以參考下
    2025-12-12
  • MyBatis-Plus QueryWrapper及LambdaQueryWrapper的使用詳解

    MyBatis-Plus QueryWrapper及LambdaQueryWrapper的使用詳解

    這篇文章主要介紹了MyBatis-Plus QueryWrapper及LambdaQueryWrapper的使用詳解,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Java使用ShardingSphere實(shí)現(xiàn)數(shù)據(jù)庫(kù)分片的策略指南

    Java使用ShardingSphere實(shí)現(xiàn)數(shù)據(jù)庫(kù)分片的策略指南

    隨著業(yè)務(wù)數(shù)據(jù)量的爆炸式增長(zhǎng),數(shù)據(jù)庫(kù)分片作為解決大數(shù)據(jù)量存儲(chǔ)和查詢性能問題的核心技術(shù),已成為現(xiàn)代分布式系統(tǒng)架構(gòu)的重要組成部分,ShardingSphere作為一套開源的分布式數(shù)據(jù)庫(kù)解決方案,提供了強(qiáng)大的數(shù)據(jù)分片功能,本文將深入探討ShardingSphere的核心分片策略
    2025-08-08
  • Java字符編碼轉(zhuǎn)換(從UTF-8到GBK)的實(shí)現(xiàn)原理與實(shí)踐

    Java字符編碼轉(zhuǎn)換(從UTF-8到GBK)的實(shí)現(xiàn)原理與實(shí)踐

    在計(jì)算機(jī)處理文本的過程中,字符編碼轉(zhuǎn)換是跨語(yǔ)言、跨平臺(tái)數(shù)據(jù)交互的核心環(huán)節(jié),本文詳細(xì)介紹了Java中Unicode與GBK字符集之間的映射原理及UTF-8與GBK編碼之間的轉(zhuǎn)換邏輯,幫助開發(fā)者理解底層機(jī)制并避免編碼問題,需要的朋友可以參考下
    2026-01-01

最新評(píng)論

正安县| 淮阳县| 定日县| 辽中县| 逊克县| 北安市| 五莲县| 湛江市| 漠河县| 镇赉县| 邯郸县| 永善县| 华亭县| 延庆县| 大名县| 黄陵县| 玉龙| 顺义区| 黄龙县| 马关县| 南木林县| 定州市| 江川县| 绥滨县| 巴彦淖尔市| 姚安县| 四川省| 如皋市| 巴楚县| 都昌县| 佛教| 博白县| 兴安盟| 澄迈县| 淮北市| 岳普湖县| 湟源县| 靖宇县| 惠东县| 垣曲县| 南阳市|