溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Spring Aop事務(wù)管理是什么

發(fā)布時(shí)間:2021-07-08 17:58:31 來(lái)源:億速云 閱讀:154 作者:chen 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“Spring Aop事務(wù)管理是什么”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Spring Aop事務(wù)管理是什么”吧!

  • 同一個(gè)類中A方法調(diào)用B方法時(shí),如果在B方法上面設(shè)置事務(wù),B方法的事務(wù)不會(huì)生效,因?yàn)锳方法不是通過(guò)代理對(duì)象訪問(wèn)的,因此事務(wù)增強(qiáng)沒(méi)有生效。但需要注意的是,如果A方法上配置了事務(wù),A和B是一個(gè)事務(wù)管理器管理的,則B方法還是在A方法的事務(wù)上下文中執(zhí)行。

/**
     * 外層方法沒(méi)有配置事務(wù),驗(yàn)證調(diào)用同類方法時(shí)的場(chǎng)景:
     * 1、方法B配置事務(wù)、執(zhí)行數(shù)據(jù)庫(kù)操作后拋出異常,數(shù)據(jù)不會(huì)回滾:因?yàn)榉椒▋?nèi)調(diào)用事務(wù)沒(méi)生效
     * 2、同上,通過(guò)代理對(duì)象訪問(wèn),事務(wù)回滾
*/
    public void pureA_tranB_throw() {
        // 沒(méi)有事務(wù),事務(wù)正常提交
        db1Op();

        // 1、不會(huì)回滾,因?yàn)榉椒▋?nèi)調(diào)用事務(wù)沒(méi)生效
        //traB_throw();

        // 2、通過(guò)代理對(duì)象,事務(wù)會(huì)回滾
        C1Services c1Services = (C1Services) AopContext.currentProxy();
        c1Services.traB_throw();

        throw new RuntimeException("test rollback");
    }
    
    @Transactional(rollbackFor = RuntimeException.class, value = "db1transactionManager")
    public void traB_throw() {
        db1Op();
        throw new RuntimeException("test rollback");
    }
    
    /**
     * 外層方法配置事務(wù),驗(yàn)證調(diào)用同類方法時(shí)的場(chǎng)景:
     * 1、方法B配置事務(wù)、執(zhí)行數(shù)據(jù)庫(kù)操作后拋出異常,雖然B方法未啟用事務(wù)的增強(qiáng),但和外層事務(wù)屬于同一個(gè)事務(wù)管理器,數(shù)據(jù)會(huì)回滾
     */
    @Transactional(rollbackFor = RuntimeException.class, value = "db1transactionManager")
    public void traA_traB_throw() {
        // 有外層事務(wù),事務(wù)會(huì)回滾
        db1Op();

        // 1、會(huì)回滾,因?yàn)殡m然方法B的事務(wù)沒(méi)失效,但是外層屬于同一個(gè)事務(wù)管理器,因此外層事務(wù)會(huì)控制其回滾
        traB_throw();

        throw new RuntimeException("test rollback");
    }

  • 同一個(gè)類中A方法調(diào)用B2方法,A和B2的事務(wù)管理器不一樣,A方法上配置事務(wù),B2上配置事務(wù),B2執(zhí)行異常。如果是A方法直接調(diào)用B2方法,B2不會(huì)回滾,同上因?yàn)槭聞?wù)增強(qiáng)沒(méi)生效,但通過(guò)代理對(duì)象訪問(wèn)可以回滾。

 /**
     * 外層方法配置事務(wù),驗(yàn)證不同數(shù)據(jù)庫(kù)操作的場(chǎng)景:
     * 1、不會(huì)回滾,B2方法的事務(wù)增強(qiáng)未生效,且B2和外層方法不是一個(gè)事務(wù)管理器,所以不會(huì)受外層事務(wù)影響
     * 2、會(huì)回滾,B2方法的事務(wù)增強(qiáng)生效,執(zhí)行異常,事務(wù)回滾
     */
    @Transactional(rollbackFor = RuntimeException.class, value = "db1transactionManager")
    public void traA_traB2_throw() {
        // 有事務(wù),事務(wù)會(huì)回滾
        db1Op();

        ///1、不會(huì)回滾,事務(wù)增強(qiáng)沒(méi)生效
        //traB2_throw();

        // 通過(guò)代理對(duì)象,事務(wù)會(huì)回滾
        C1Services c1Services = (C1Services) AopContext.currentProxy();
        c1Services.traB2_throw();

        throw new RuntimeException("test rollback");
    }

    @Transactional(rollbackFor = RuntimeException.class, value = "db2transactionManager")
    public void traB2_throw() {
        db2();
        throw new RuntimeException("test rollback");
    }
 

  • 不同類中C1類的A方法調(diào)用C2類的B方法,通過(guò)類的實(shí)例對(duì)象調(diào)用B方法,如果B方法設(shè)置事務(wù),因?yàn)槭峭ㄟ^(guò)代理對(duì)象訪問(wèn),因此事務(wù)增強(qiáng)會(huì)生效。

  • 事務(wù)的傳播行為有:

REQUIRED    支持當(dāng)前事務(wù),如果當(dāng)前事務(wù)不存在,則創(chuàng)建新事務(wù)。是spring事務(wù)管理的默認(rèn)隔離級(jí)別
SUPPORTS    支持當(dāng)前事務(wù),如果當(dāng)前事務(wù)不存在,則按照無(wú)事務(wù)運(yùn)行
MANDATORY    支持當(dāng)前事務(wù),如果當(dāng)前事務(wù)不存在,則拋出異常
REQUIRES_NEW    創(chuàng)建一個(gè)新事務(wù),如果當(dāng)前事務(wù)存在,則掛起當(dāng)前事務(wù)
NOT_SUPPORTED    按照無(wú)事務(wù)運(yùn)行,如果當(dāng)前事務(wù)存在,則掛起當(dāng)前事務(wù)
NEVER            按照無(wú)事務(wù)運(yùn)行,如果當(dāng)前事務(wù)存在,則拋出異常
NESTED        如果當(dāng)前事務(wù)存在,則按照嵌套事務(wù)的方式執(zhí)行,在特別的事務(wù)管理器上才會(huì)創(chuàng)建嵌套事務(wù),一些JTA的提供者支持嵌套事務(wù)管理器

到此,相信大家對(duì)“Spring Aop事務(wù)管理是什么”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI