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

Spring中七種事務(wù)傳播機制詳解

 更新時間:2024年01月17日 10:21:50   作者:java-zh  
這篇文章主要介紹了Spring中七種事務(wù)傳播機制詳解,Spring在TransactionDefinition接口中規(guī)定了7種類型的事務(wù)傳播行為,Propagation枚舉則引用了這些類型,開發(fā)過程中我們一般直接用Propagation枚舉,需要的朋友可以參考下

一、概述

Spring在TransactionDefinition接口中規(guī)定了7種類型的事務(wù)傳播行為。

Propagation枚舉則引用了這些類型,開發(fā)過程中我們一般直接用Propagation枚舉。

1.1 Propagation源碼

public enum Propagation {    REQUIRED(0),    SUPPORTS(1),    MANDATORY(2),    REQUIRES_NEW(3),    NOT_SUPPORTED(4),    NEVER(5),    NESTED(6);    private final int value;    private Propagation(int value) {        this.value = value;    }    public int value() {        return this.value;    }}public enum Propagation {
    REQUIRED(0),
    SUPPORTS(1),
    MANDATORY(2),
    REQUIRES_NEW(3),
    NOT_SUPPORTED(4),
    NEVER(5),
    NESTED(6);
    private final int value;
    private Propagation(int value) {
        this.value = value;
    }
    public int value() {
        return this.value;
    }
}

1.2、類型解析

  • Propagation.REQUIRED(默認機制):如果當(dāng)前存在事務(wù),那么就加入這個事務(wù),不存在就新建一個事務(wù)。
  • Propagation.SUPPORTS:如果當(dāng)前有事務(wù),加入事務(wù),如果沒有則不使用事務(wù)
  • Propagation.MANDATORY:使用當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就拋出異常
  • Propagation.REQUIRES_NEW:新建新的事務(wù),如果當(dāng)前存在事務(wù),就把當(dāng)前事務(wù)掛起
  • Propagation.NOT_SUPPORTED:以非事務(wù)方式執(zhí)行操作,如果當(dāng)前存在事務(wù),把當(dāng)前事務(wù)掛起
  • Propagation.NEVER:以非事務(wù)方式執(zhí)行操作,如果當(dāng)前存在事務(wù),就拋出異常
  • Propagation.NESTED:如果當(dāng)前存在事務(wù),則嵌套在事務(wù)內(nèi)執(zhí)行。如果當(dāng)前沒有事務(wù),則執(zhí)行Propagation.REQUIRED類似操作

1.3 分類舉例

傳播機制解釋
Propagation.NEVER非事務(wù)執(zhí)行操作,存在事務(wù),拋出異常
Propagation.MANDATORY使用當(dāng)前事務(wù),沒有事務(wù),拋出異常

代碼案例:

//controller
@RestController
@RequestMapping("/op")
public class TestController {
    @Autowired
    private TestService testService;
    @GetMapping("/test1")
    public void test1() {
        testService.test1();
    }
}
//service
public interface TestService2 extends BaseService<Test> {
    void test2();
    void test3();
}
@Service
public class TestServiceImpl2 extends BaseServiceImpl<TestMapper, Test> implements TestService2 {
    @Override
    @Transactional(propagation = Propagation.NEVER, rollbackFor = Exception.class)
    public void test2() {
        System.out.println("test2 存在事務(wù) NEVER");
    }
    @Override
    public void test3() {
        System.out.println("test3 沒有事務(wù)");
    }
}
public interface TestService extends BaseService<Test> {
    int insert(Test test);
    int update(Test test);
    void test1();
    void test4();
}
@Service
public class TestServiceImpl extends BaseServiceImpl<TestMapper, Test> implements TestService {
    @Autowired
    private TestService2 testService2;
    @Override
    public int insert(Test test) {
        return getBaseMapper().insert(test);
    }
    @Override
    public int update(Test test) {
        return getBaseMapper().updateById(test);
    }
    @Override
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public void test1() {
        System.out.println("test1 存在事務(wù) REQUIRED");
        //如果在調(diào)用NEVER類型的時候,一定要用這種代理的方式,NEVER才會生效
        testService2.test2();
    }
    @Override
    @Transactional(propagation = Propagation.MANDATORY, rollbackFor = Exception.class)
    public void test4() {
        System.out.println("test4 存在事務(wù) MANDATORY");
        testService2.test3();
    }
}

測試結(jié)果

Propagation.NEVER

Propagation.MANDATORY

傳播機制解釋
Propagation.REQUIRED需要在事務(wù)中執(zhí)行,外層有事務(wù)就加入,沒有事務(wù)就自己創(chuàng)建一個事務(wù)
Propagation.REQUIRES_NEW需要在一個新的事務(wù)中執(zhí)行,這個事務(wù)獨立于外層的事務(wù),互不影響

Propagation.REQUIRES_NEW案例

@Override
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public void test5() {
        System.out.println("當(dāng)前事務(wù) REQUIRED ");
        Test test = new Test();
        test.setUserName("上海");
        test.setAddress("中國");
        getBaseMapper().insert(test);
        //test6用REQUIRES_NEW修飾,里面有異常,那么當(dāng)前的事務(wù)也會回滾,如果test5有異常,test6不會受到影響
        testService2.test6();
        //當(dāng)前事務(wù)進行回滾,test6內(nèi)容會正常增加
        int i = 1/0;
    }
@Override
    @Transactional(propagation = Propagation.REQUIRES_NEW,rollbackFor = Exception.class)
    public void test6() {
        System.out.println("創(chuàng)建了一個新的事務(wù)");
        Test test = new Test();
        test.setUserName("廣州");
        test.setAddress("中國");
        getBaseMapper().insert(test);
    }

注意點:

REQUIRES_NEW如果在內(nèi)層,它里面的事務(wù)獨立于外層的事務(wù),外層事務(wù)如果發(fā)送異?;貪L跟REQUIRES_NEW里面內(nèi)容無關(guān),如果REQUIRES_NEW里面內(nèi)容回滾,那么外層的事務(wù)也會跟著回滾。

Propagation.REQUIRES_NEW測試結(jié)果

傳播機制解釋
Propagation.SUPPORTS外層有事務(wù)就加入,如果沒有事務(wù),就以非事務(wù)方式執(zhí)行
Propagation.NOT_SUPPORTED以非事務(wù)的方式執(zhí)行,執(zhí)行的時候,先將外層的事務(wù)掛起,允許外層有事務(wù)。
傳播機制解釋
Propagation.NESTED        嵌套事務(wù),它是已經(jīng)存在事務(wù)的真正子事務(wù),嵌套事務(wù)開始執(zhí)行時,會取得一個保存點(savepoint),如果這個嵌套事務(wù)失敗,將會回滾導(dǎo)這個保存點(savepoint),而不是整個事務(wù)的回滾
@Override
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public void test7() {
        System.out.println("當(dāng)前事務(wù) REQUIRED ");
        Test test = new Test();
        test.setUserName("上海");
        test.setAddress("中國");
        getBaseMapper().insert(test);
        //NESTED事務(wù)如果進行回滾,但是不會對它外層的事務(wù)造成影響
        try{
            testService2.test8();
        }catch (Exception e){
        }
    }
  @Override
    @Transactional(propagation = Propagation.NESTED,rollbackFor = Exception.class)
    public void test8() {
        System.out.println("創(chuàng)建了一個新的子事務(wù)");
        Test test = new Test();
        test.setUserName("廣州");
        test.setAddress("中國");
        getBaseMapper().insert(test);
        int i = 1/0;
    }

二、總結(jié)

2.1 REQUIRED,REQUIRES_NEW,NESTED

狀態(tài)REQUIRES_NEW(兩個獨立事務(wù))NESTED(B事務(wù)嵌套在A事務(wù)中)REQUIRED同一個事務(wù)
A異常B正常A回滾,B正常提交A與B一起回滾A與B一起回滾
A正常B異常B先回滾,A正常提交B先回滾,A再正常提交A與B一起回滾
A正常B正常B先提交,A再提交A與B一起提交A與B一起提交

2.2 三者不同

REQUIRED

  • 假設(shè)在A?法存在?個當(dāng)前事務(wù),B?法的事務(wù)傳播機制為REQUIRED,則B?法會合并到A?法的事務(wù)?執(zhí)?。
  • A、B任意?個?法異常(默認是RuntimeException和Error)都會導(dǎo)致A、B的操作被回滾。
  • Spring事務(wù)管理器不會吞異常。
  • B異常后會拋給A,A如果沒有catch這個異常,會繼續(xù)向上拋。如果A catch住了,Spring事務(wù)管理器會替A向上拋?個
  • UnexpectedRollbackException??傊?,?旦A、B回滾,A的調(diào)???定能收到?個異常感知到回滾。(問題所在)

REQUIRES_NEW

  • 如果B發(fā)?異常,B事務(wù)?定回滾,B的異常隨后會拋給A,如果A catch住了這個異常,A不會回滾,否則A也會回滾。
  • 如果A發(fā)?異常,則只會回滾A,不會回滾B。

NESTED

  • 如果B異常,B?定回滾,B的異常隨后會拋給A,如果A catch住了這個異常,A不會回滾,否則A也會回滾。這種情況和REQUIRES_NEW?樣。
  • 如果A發(fā)?異常,則A、B都會回滾。

2.3 手動回滾

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public void test7() {
        System.out.println("當(dāng)前事務(wù) REQUIRED ");
        Test test = new Test();
        test.setUserName("上海");
        test.setAddress("中國");
        getBaseMapper().insert(test);
        //NESTED事務(wù)如果進行回滾,但是不會對它外層的事務(wù)造成影響
        try{
            testService2.test8();
        }catch (Exception e){
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    }

到此這篇關(guān)于Spring中七種事務(wù)傳播機制詳解的文章就介紹到這了,更多相關(guān)Spring事務(wù)傳播機制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實現(xiàn)猜數(shù)字小游戲代碼

    Java實現(xiàn)猜數(shù)字小游戲代碼

    大家好,本篇文章主要講的是Java實現(xiàn)猜數(shù)字小游戲代碼,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • 淺談JSON的數(shù)據(jù)交換、緩存問題和同步問題

    淺談JSON的數(shù)據(jù)交換、緩存問題和同步問題

    這篇文章主要介紹了淺談JSON的數(shù)據(jù)交換、緩存問題和同步問題,具有一定借鑒價值,需要的朋友可以參考下
    2017-12-12
  • Java中避免空指針異常的方法

    Java中避免空指針異常的方法

    這篇文章主要介紹了Java中避免空指針異常的方法,本文討論Optional類型、Objects類等技術(shù),需要的朋友可以參考下
    2014-10-10
  • 你可知HashMap為什么是線程不安全的

    你可知HashMap為什么是線程不安全的

    這篇文章主要介紹了你可知HashMap為什么是線程不安全的,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Spring Cloud Config解決的問題和案例

    Spring Cloud Config解決的問題和案例

    Spring Cloud Config 是 Spring Cloud 套件中的一個工具,提供了在分布式系統(tǒng)中對外部化配置的服務(wù)器端和客戶端支持,本文介紹了Spring Cloud Config解決的問題和案例,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下
    2024-07-07
  • javafx 如何將項目打包為 Windows 的可執(zhí)行文件exe

    javafx 如何將項目打包為 Windows 的可執(zhí)行文件exe

    文章介紹了三種將JavaFX項目打包為.exe文件的方法:方法1使用jpackage(適用于JDK14及以上版本),方法2使用Launch4j(適用于所有JDK版本),方法3使用InnoSetup(用于創(chuàng)建安裝包),每種方法都有其特點和適用范圍,可以根據(jù)項目需求選擇合適的方法,感興趣的朋友一起看看吧
    2025-01-01
  • 使用IDEA啟動項目遇見ClassNotFoundException的解決方案

    使用IDEA啟動項目遇見ClassNotFoundException的解決方案

    這篇文章主要介紹了使用IDEA啟動項目遇見ClassNotFoundException的正確解決方案,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • SpringBoot實現(xiàn)動態(tài)加載外部Jar流程詳解

    SpringBoot實現(xiàn)動態(tài)加載外部Jar流程詳解

    這篇文章主要介紹了SpringBoot動態(tài)加載外部Jar的流程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-05-05
  • 詳解Java中Quartz的簡單使用

    詳解Java中Quartz的簡單使用

    Quartz?是一個開源的作業(yè)調(diào)度框架,它完全由?Java?寫成,并設(shè)計用于?J2SE?和?J2EE?應(yīng)用中。這篇文章主要通過示例和大家講講Quartz的簡單使用,需要的可以參考一下
    2023-04-04
  • IDEA配置JavaFX全過程

    IDEA配置JavaFX全過程

    從Java11起,Java不再內(nèi)置JavaFX,在Java17項目中,需手動配置開發(fā)環(huán)境,添加JavaFX庫路徑,并設(shè)置運行參數(shù)指向本地路徑
    2025-09-09

最新評論

怀仁县| 镇平县| 双流县| 虞城县| 岗巴县| 灵寿县| 青州市| 紫阳县| 阿克苏市| 凤山县| 安新县| 龙游县| 平潭县| 博兴县| 平潭县| 赤水市| 夏津县| 西乌珠穆沁旗| 玉门市| 石渠县| 滨海县| 志丹县| 安徽省| 宕昌县| 休宁县| 浦县| 塔河县| 花垣县| 准格尔旗| 噶尔县| 普格县| 汶川县| 桓仁| 宜丰县| 庄浪县| 日土县| 铜梁县| 乌兰县| 察隅县| 南平市| 南昌县|