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

Spring調(diào)用this導(dǎo)致事務(wù)失效的三種解決方案

 更新時(shí)間:2026年02月26日 09:22:15   作者:五阿哥永琪  
在 Spring 事務(wù)管理 中,如果你在同一個(gè)類的方法內(nèi)部使用 this.xxx() 調(diào)用另一個(gè)帶 @Transactional 的方法,事務(wù)很可能會(huì)失效,這不是玄學(xué),而是代理機(jī)制在背后打盹了,本文就給大家介紹如何解決this調(diào)用導(dǎo)致事務(wù)失效問題,需要的朋友可以參考下

一、為什么this調(diào)用會(huì)導(dǎo)致事務(wù)失效?

Spring 的聲明式事務(wù)基于 AOP 代理 實(shí)現(xiàn):

  • Spring 為你的 Bean 創(chuàng)建一個(gè) 代理對(duì)象
  • 事務(wù)邏輯在代理對(duì)象中織入
  • 只有 通過代理對(duì)象調(diào)用方法 才會(huì)觸發(fā)事務(wù)

失效場(chǎng)景

@Service
public class OrderService {

    public void createOrder() {
        // 直接調(diào)用
        this.saveOrder();   // ? 不經(jīng)過代理
    }

    @Transactional
    public void saveOrder() {
        // 數(shù)據(jù)庫操作
    }
}

調(diào)用路徑:

createOrder() → this.saveOrder()

這里沒有經(jīng)過 Spring 代理 → 事務(wù)不會(huì)生效。

二、如何保證事務(wù)生效?

方案一:通過 Spring 代理對(duì)象調(diào)用(推薦?????)

方法1:注入自身代理

@Service
public class OrderService {

    @Autowired
    private OrderService orderService; // 注入代理對(duì)象

    public void createOrder() {
        orderService.saveOrder(); // ? 通過代理調(diào)用
    }

    @Transactional
    public void saveOrder() {
    }
}

原理:Spring 注入的是代理對(duì)象,而不是原始對(duì)象。

方法2:使用 AopContext 獲取代理(需開啟暴露代理)

① 開啟配置

@EnableAspectJAutoProxy(exposeProxy = true)

② 調(diào)用方式

public void createOrder() {
    ((OrderService) AopContext.currentProxy()).saveOrder();
}

適合不想注入自身的場(chǎng)景。

方案二:拆分到不同 Service(最佳實(shí)踐?????)

這是企業(yè)項(xiàng)目最推薦的結(jié)構(gòu)設(shè)計(jì)。

@Service
public class OrderService {

    @Autowired
    private OrderTxService orderTxService;

    public void createOrder() {
        orderTxService.saveOrder();
    }
}

@Service
public class OrderTxService {

    @Transactional
    public void saveOrder() {
    }
}

? 更清晰
? 職責(zé)單一
? 更利于維護(hù) & 擴(kuò)展

這是大型系統(tǒng)常見架構(gòu)方式。

方案三:使用編程式事務(wù)(不常用)

@Autowired
private TransactionTemplate transactionTemplate;

public void createOrder() {
    transactionTemplate.execute(status -> {
        saveOrder();
        return null;
    });
}

適用于:

  • 需要精細(xì)控制事務(wù)
  • 復(fù)雜業(yè)務(wù)流程

但日常開發(fā)不推薦優(yōu)先使用。

以上就是Spring調(diào)用this導(dǎo)致事務(wù)失效的三種解決方案的詳細(xì)內(nèi)容,更多關(guān)于Spring調(diào)用this導(dǎo)致事務(wù)失效的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java的validation參數(shù)校驗(yàn)代碼實(shí)例

    Java的validation參數(shù)校驗(yàn)代碼實(shí)例

    這篇文章主要介紹了Java的validation參數(shù)校驗(yàn)代碼實(shí)例,Validation參數(shù)校驗(yàn)是指在程序運(yùn)行中對(duì)傳進(jìn)來的參數(shù)進(jìn)行合法性檢查,以保證程序的正確性和安全性,需要的朋友可以參考下
    2023-10-10
  • 詳解Java中Dijkstra(迪杰斯特拉)算法的圖解與實(shí)現(xiàn)

    詳解Java中Dijkstra(迪杰斯特拉)算法的圖解與實(shí)現(xiàn)

    Dijkstra(迪杰斯特拉)算法是典型的單源最短路徑算法,用于計(jì)算一個(gè)節(jié)點(diǎn)到其他所有節(jié)點(diǎn)的最短路徑。本文將詳解該算法的圖解與實(shí)現(xiàn),需要的可以參考一下
    2022-05-05
  • 基于JDK動(dòng)態(tài)代理原理解析

    基于JDK動(dòng)態(tài)代理原理解析

    這篇文章主要介紹了基于JDK動(dòng)態(tài)代理原理解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • java中日期格式化的大坑

    java中日期格式化的大坑

    這篇文章主要介紹了java中日期格式化的大坑,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Log4j2?重大漏洞編譯好的log4j-2.15.0.jar包下載(替換過程)

    Log4j2?重大漏洞編譯好的log4j-2.15.0.jar包下載(替換過程)

    Apache?開源項(xiàng)目?Log4j?的遠(yuǎn)程代碼執(zhí)行漏洞細(xì)節(jié)被公開,由于?Log4j?的廣泛使用,該漏洞一旦被攻擊者利用會(huì)造成嚴(yán)重危害,下面小編給大家?guī)砹薒og4j2?重大漏洞編譯好的log4j-2.15.0.jar包下載,感興趣的朋友一起看看吧
    2021-12-12
  • Java 對(duì)象序列化 NIO NIO2詳細(xì)介紹及解析

    Java 對(duì)象序列化 NIO NIO2詳細(xì)介紹及解析

    這篇文章主要介紹了Java 對(duì)象序列化 NIO NIO2詳細(xì)介紹及解析的相關(guān)資料,序列化機(jī)制可以使對(duì)象可以脫離程序的運(yùn)行而對(duì)立存在,需要的朋友可以參考下
    2017-02-02
  • Java編程實(shí)現(xiàn)A*算法完整代碼

    Java編程實(shí)現(xiàn)A*算法完整代碼

    這篇文章主要介紹了Java編程實(shí)現(xiàn)A*算法完整代碼,簡(jiǎn)單介紹了a星算法,然后分享了完整測(cè)試代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-11-11
  • Maven的POM常用標(biāo)簽詳解

    Maven的POM常用標(biāo)簽詳解

    本文介紹maven中pom常用標(biāo)簽作用和用法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-09-09
  • Springboot中如何自動(dòng)轉(zhuǎn)JSON輸出

    Springboot中如何自動(dòng)轉(zhuǎn)JSON輸出

    這篇文章主要介紹了Springboot中如何自動(dòng)轉(zhuǎn)JSON輸出,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java并發(fā)編程:CountDownLatch與CyclicBarrier和Semaphore的實(shí)例詳解

    Java并發(fā)編程:CountDownLatch與CyclicBarrier和Semaphore的實(shí)例詳解

    這篇文章主要介紹了Java并發(fā)編程:CountDownLatch與CyclicBarrier和Semaphore的實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-09-09

最新評(píng)論

铁岭市| 台北县| 类乌齐县| 靖西县| 手游| 临湘市| 镶黄旗| 马龙县| 霍邱县| 麦盖提县| 定州市| 夏津县| 柳河县| 峨眉山市| 湘潭市| 年辖:市辖区| 伊川县| 潮安县| 锦州市| 恩施市| 阿荣旗| 盖州市| 邯郸市| 珲春市| 苏尼特右旗| 无极县| 衡水市| 武夷山市| 延津县| 淮安市| 乳山市| 仁化县| 五河县| 互助| 屯昌县| 株洲市| 潢川县| 河源市| 龙井市| 蓝田县| 叙永县|