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

Spring事務(wù)傳播中嵌套調(diào)用實現(xiàn)方法詳細(xì)介紹

 更新時間:2022年11月08日 17:06:35   作者:宏遠(yuǎn)十一冠王  
Spring事務(wù)的本質(zhì)就是對數(shù)據(jù)庫事務(wù)的支持,沒有數(shù)據(jù)庫事務(wù),Spring是無法提供事務(wù)功能的。Spring只提供統(tǒng)一的事務(wù)管理接口,具體實現(xiàn)都是由數(shù)據(jù)庫自己實現(xiàn)的,Spring會在事務(wù)開始時,根據(jù)當(dāng)前設(shè)置的隔離級別,調(diào)整數(shù)據(jù)庫的隔離級別,由此保持一致

前言

最近在使用Spring框架時遇到了一些問題,主要是Spring的事務(wù)傳播問題,一個不帶事務(wù)的方法調(diào)用帶事務(wù)的方法,有時候會出現(xiàn)不回滾的情況,所以寫了這篇文章來記錄一下。

7種傳播方式

我們先來看Spring事務(wù)的7中傳播方式以及對應(yīng)的描述

屬性名稱描述
PROPAGATION__REQUIREDREQUIRED表示的是當(dāng)前這個方法必須運行在一個事務(wù)環(huán)境中,如果當(dāng)前方法已經(jīng)處于事務(wù)環(huán)境中,就可以直接使用該方法,否則開啟一個新的事務(wù)
PROPAGATION_SUPPORTSSUPPORTS如果當(dāng)前方法處于事務(wù)環(huán)境中,就使用當(dāng)前事務(wù),否則不使用事務(wù)
PROPAGATION_MANDATORYMANDATORY表示當(dāng)前方法一定要處于事務(wù)環(huán)境中,否則就拋出異常
PROPAGATION_REQUIRES_NEWREQUIRES_NEW當(dāng)前方法需要運行在新的事務(wù)中。如果當(dāng)前方法已在事務(wù)環(huán)境中,先暫停當(dāng)前事務(wù),在啟動新的事務(wù)方法后才執(zhí)行該方法,如果當(dāng)前方法不在事務(wù)環(huán)境中,就啟動一個新的事務(wù)后啟動執(zhí)行該方法。
PROPAGATION_NOT_SUPPORTEDNOT_SUPPORTED不支持當(dāng)前的事務(wù),總是以非事務(wù)狀態(tài)執(zhí)行。如果這個方法是事務(wù)方法,就先掛起這個事務(wù)方法,再執(zhí)行這個方法
PROPAGATION_NEVERNEVER不支持當(dāng)前事務(wù),如果是事務(wù)方法,則拋出異常
PROPAGATION__NESTEDNESTED如果當(dāng)前執(zhí)行的方法處于事務(wù)環(huán)境中,依舊會啟動一個事務(wù),嵌套的事務(wù)也可以獨立于當(dāng)前事務(wù)獨立回滾和提交,如果當(dāng)前執(zhí)行的方法不在事務(wù)環(huán)境中,也會啟動一個新事務(wù)。

注解式事務(wù)

在Spring中,我們常用@Transactional來標(biāo)注一個事務(wù)方法,如果有點進(jìn)去這個注解的源碼都可以看到Spring對于添加這個注解的方法,都會默認(rèn)將這個方法的事務(wù)的傳播等級設(shè)置為REQUIRED,也就是是當(dāng)前方法必須處于一個事務(wù)方法中,或者使用調(diào)用這個方法的事務(wù)行為。

下面我們來分析下這個注解在什么情況下會失效,并且需要怎么樣來去避免這種情況的發(fā)生。

事務(wù)的方法之間的調(diào)用

下面這個例子模仿的是一個帶事務(wù)的方法調(diào)用另外一個事務(wù)方法,在下面的這個方法報錯,查看當(dāng)前事務(wù)有沒有進(jìn)行回滾

@Override
    @Transactional(rollbackFor = Exception.class)
    public void saveWithDish(SetmealDto setmealDto){
        this.save(setmealDto);
        List<SetmealDish> setmealDishes = setmealDto.getSetmealDishes();
    }
    @Transactional(rollbackFor = Exception.class)
    public void saveBa(List<SetmealDish> setmealDishes, SetmealDto setmealDto) throws Exception{
        setmealDishes = setmealDishes.stream().peek((item) -> item.setSetmealId(setmealDto.getId())).collect(Collectors.toList());
        setmealDishService.saveBatch(setmealDishes);
        int j = 2/0;
    }

根據(jù)事務(wù)的傳播等級來看,這種情況是肯定可以回滾的,但是如果是同一類中,像下面這種情況,同一個類中一個不帶事務(wù)的方法調(diào)用另外一個帶事務(wù)的方法,這種情況下它的事務(wù)會不會回滾呢?理論上我們覺得是會的,但是在測試的時候呢,我們發(fā)現(xiàn)這個事務(wù)并沒有進(jìn)行回滾,也就是說,這個事務(wù)注解@Transantional沒有生效

@Override
    public void saveWithDish(SetmealDto setmealDto) throws Exception{
        List<SetmealDish> setmealDishes = setmealDto.getSetmealDishes();
        saveBa(setmealDishes, setmealDto);
    }
    @Transactional(rollbackFor = Exception.class)
    public void saveBa(List<SetmealDish> setmealDishes, SetmealDto setmealDto) throws Exception{
        this.save(setmealDto);
        setmealDishes = setmealDishes.stream().peek((item) -> item.setSetmealId(setmealDto.getId())).collect(Collectors.toList());
        setmealDishService.saveBatch(setmealDishes);
        int j = 2/0;
    }

雖然這里我們報錯了,但是數(shù)據(jù)庫中還是新增了一條剛剛我們添加的一條數(shù)據(jù),這樣可以說明,這是沒有添加事務(wù)的,也驗證了上面我們的方法。

下面我們來看情況上,當(dāng)不同類之間類方法的調(diào)用,如果一個事務(wù)方法調(diào)用一個非事務(wù)方法,這樣非事務(wù)方法當(dāng)然可以獲取到當(dāng)前這個事務(wù)的,不會開啟一個新的事務(wù)。但是當(dāng)一個非事務(wù)方法調(diào)用一個不同類的事務(wù)方法時,這樣會不會回滾呢,答案是會的,這邊我已經(jīng)進(jìn)行驗證過了。

注意事項

我們需要記住Spring的默認(rèn)事務(wù)傳播等級是Required,在Spring掃描Bean時,會掃描這個方法是否帶有@Transactional注解,如果是包含的話,Spring會動態(tài)生成一個代理類(proxy),當(dāng)這個方法被調(diào)用時,是由代理類來進(jìn)行調(diào)用的,而在初始化時,同一個類下面,這個方法如果是沒有帶@Transactional注解調(diào)用一個@Transactional的方法的話,這個方法的調(diào)用是沒有經(jīng)過代理類的,就不會啟動transactional,也就是在同一個類出現(xiàn)無效的現(xiàn)象出現(xiàn)

所以,解決的話,我們可以將這兩個方法分開到兩個不同的類中,所以我們可以知道在一個service類中,如果一個非事務(wù)方法調(diào)用一個帶事務(wù)的方法和事務(wù)方法之間的相互調(diào)用都不會開啟新的事務(wù)。

到此這篇關(guān)于Spring事務(wù)傳播中嵌套調(diào)用實現(xiàn)方法詳細(xì)介紹的文章就介紹到這了,更多相關(guān)Spring嵌套調(diào)用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java將CSV的數(shù)據(jù)發(fā)送到kafka的示例

    Java將CSV的數(shù)據(jù)發(fā)送到kafka的示例

    這篇文章主要介紹了Java將CSV的數(shù)據(jù)發(fā)送到kafka得示例,幫助大家更好得理解和使用Java,感興趣的朋友可以了解下
    2020-11-11
  • struts中動態(tài)方法調(diào)用使用通配符

    struts中動態(tài)方法調(diào)用使用通配符

    這篇文章主要介紹了struts中動態(tài)方法調(diào)用使用通配符的相關(guān)資料,非常不錯,具有參考借鑒價值,感興趣的朋友一起看看吧
    2016-09-09
  • Springboot常用注解及配置文件加載順序詳解

    Springboot常用注解及配置文件加載順序詳解

    這篇文章主要介紹了Springboot常用注解及配置文件加載順序,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-11-11
  • Springboot 2使用外部Tomcat源碼分析

    Springboot 2使用外部Tomcat源碼分析

    這篇文章主要介紹了Springboot 2使用外部Tomcat源碼分析,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • SpringBoot多線程進(jìn)行異步請求的處理方式

    SpringBoot多線程進(jìn)行異步請求的處理方式

    這篇文章主要介紹了SpringBoot多線程進(jìn)行異步請求的處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜
    2021-12-12
  • 深入理解Java之jvm啟動流程

    深入理解Java之jvm啟動流程

    這篇文章主要介紹了深入理解Java之jvm啟動流程,文章內(nèi)容講解的很清晰,有對這方面感興趣的同學(xué)可以研究下
    2021-02-02
  • Spring中的@EnableConfigurationProperties使用方式以及作用詳解

    Spring中的@EnableConfigurationProperties使用方式以及作用詳解

    這篇文章主要介紹了Spring中的@EnableConfigurationProperties使用方式以及作用詳解,使用了?@ConfigurationProperties?注解的配置類生效,將該類注入到?IOC?容器中,交由?IOC?容器進(jìn)行管理,此時則不用再配置類上加上@Component,需要的朋友可以參考下
    2024-01-01
  • 淺談java指令重排序的問題

    淺談java指令重排序的問題

    下面小編就為大家?guī)硪黄獪\談java指令重排序的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • Java中的什么場景使用遞歸,如何使用遞歸

    Java中的什么場景使用遞歸,如何使用遞歸

    這篇文章主要介紹了Java中的什么場景使用遞歸,如何使用遞歸的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java實現(xiàn)學(xué)生信息管理界面

    Java實現(xiàn)學(xué)生信息管理界面

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)學(xué)生信息管理界面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06

最新評論

资中县| 大港区| 新泰市| 栾川县| 项城市| 阜宁县| 化德县| 汤阴县| 大庆市| 丹阳市| 龙山县| 盖州市| 齐齐哈尔市| 丘北县| 乌兰县| 牙克石市| 宁晋县| 贵南县| 九台市| 和平县| 和政县| 青田县| 全州县| 喀喇沁旗| 宁国市| 临江市| 体育| 奇台县| 镶黄旗| 东安县| 绍兴市| 龙江县| 全南县| 德安县| 城步| 翼城县| 葫芦岛市| 河西区| 夏河县| 措美县| 祁连县|