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

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

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

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

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

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

失效場景

@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ù)不會生效。

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

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

方法1:注入自身代理

@Service
public class OrderService {

    @Autowired
    private OrderService orderService; // 注入代理對象

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

    @Transactional
    public void saveOrder() {
    }
}

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

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

① 開啟配置

@EnableAspectJAutoProxy(exposeProxy = true)

② 調(diào)用方式

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

適合不想注入自身的場景。

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

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

@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ù)失效的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

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

    Java的validation參數(shù)校驗代碼實例

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

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

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

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

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

    java中日期格式化的大坑

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

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

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

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

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

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

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

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

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

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

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

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

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

最新評論

行唐县| 莎车县| 当阳市| 龙川县| 柏乡县| 金寨县| 增城市| 屏山县| 廊坊市| 西乌珠穆沁旗| 蓬溪县| 隆子县| 孟连| 商都县| 沁水县| 哈巴河县| 碌曲县| 通江县| 丰都县| 三亚市| 铜陵市| 泰来县| 大姚县| 交口县| 敦煌市| 安泽县| 宜君县| 资源县| 秦皇岛市| 广饶县| 龙山县| 平定县| 宜昌市| 贵州省| 浠水县| 启东市| 关岭| 含山县| 濮阳县| 苏州市| 蒙山县|