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

spring 事務(wù)實(shí)現(xiàn)的示例

 更新時(shí)間:2026年02月02日 08:29:21   作者:yingjuxia.com  
本文主要介紹了spring 事務(wù)實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

Spring 的事務(wù)實(shí)現(xiàn)本質(zhì)上是基于 AOP(面向切面編程) + 動態(tài)代理,在不修改原有業(yè)務(wù)代碼的情況下,把事務(wù)的開始、提交、回滾、異常處理這些橫切關(guān)注點(diǎn)“織入”到目標(biāo)方法中。

下面從最核心的幾個(gè)層面逐步拆解(以聲明式事務(wù) @Transactional 為例,這是 95%+ 項(xiàng)目實(shí)際使用的模式):

1. 整體架構(gòu)分層(最重要的一張思維導(dǎo)圖)

Spring 事務(wù)抽象層(PlatformTransactionManager)
          ↑
    具體實(shí)現(xiàn)(DataSourceTransactionManager / JpaTransactionManager / JtaTransactionManager 等)
          ↑
   TransactionSynchronizationManager(線程本地資源管理器)
          ↑
   AOP 切面(TransactionInterceptor + 各種 Advice)
          ↑
   動態(tài)代理(JDK Proxy / CGLIB)
          ↑
   你的業(yè)務(wù) Bean(@Service 中的 @Transactional 方法)

2. 核心實(shí)現(xiàn)步驟(運(yùn)行時(shí)發(fā)生了什么)

階段發(fā)生了什么關(guān)鍵類 / 組件
容器啟動解析 @EnableTransactionManagement 或 <tx:annotation-driven/>TransactionManagementConfigurer / AnnotationDrivenBeanDefinitionParser
注冊 BeanFactoryTransactionAttributeSourceAdvisor(事務(wù)切面 Advisor)
Bean 創(chuàng)建對于有 @Transactional 的類/方法,Spring 創(chuàng)建代理對象ProxyFactory / CglibAopProxy / JdkDynamicAopProxy
外部調(diào)用方法時(shí)調(diào)用的是代理對象的方法(不是原始對象)
代理攔截TransactionInterceptor(核心 Advice)被執(zhí)行TransactionInterceptor.invoke()
讀取 @Transactional 的屬性(propagation、isolation、timeout、rollbackFor 等)TransactionAttributeSource
事務(wù)開始調(diào)用 PlatformTransactionManager.getTransaction(definition)→ 創(chuàng)建 / 加入 / 掛起事務(wù)
把 Connection / TransactionStatus 綁定到 ThreadLocalTransactionSynchronizationManager.bindResource()
目標(biāo)方法執(zhí)行真正執(zhí)行你的業(yè)務(wù)代碼(原始對象的方法)
正常結(jié)束提交:commit()TransactionManager.commit(status)
異常拋出判斷是否需要回滾(默認(rèn) RuntimeException & Error 回滾,可自定義 rollbackFor)rollbackOn() 判斷
回滾:rollback()TransactionManager.rollback(status)
清理解綁 ThreadLocal 資源,恢復(fù)掛起的舊事務(wù)(如果有嵌套)cleanupTransaction()

3. 傳播行為(Propagation)是怎么實(shí)現(xiàn)的?(最??键c(diǎn))

傳播級別代碼中是否有事務(wù)外面有事務(wù)嗎?實(shí)際效果底層實(shí)現(xiàn)方式簡述
REQUIRED新開事務(wù)getTransaction() 創(chuàng)建新事務(wù)
REQUIRED加入已有事務(wù)復(fù)用已有 TransactionStatus
REQUIRES_NEW總是新建獨(dú)立事務(wù)(外面事務(wù)被掛起)suspend() → create new → resume()
NESTED使用 savepoint(嵌套子事務(wù))createSavepoint() / rollbackToSavepoint()
SUPPORTS跟隨外面事務(wù),沒有就不用事務(wù)只讀模式或無事務(wù)
MANDATORY拋異常(必須在事務(wù)中調(diào)用)檢查當(dāng)前是否有事務(wù),沒有就 IllegalState
NEVER拋異常(禁止在事務(wù)中調(diào)用)同上
NOT_SUPPORTED掛起外面事務(wù),以非事務(wù)方式執(zhí)行suspend() → 執(zhí)行 → resume()

注意:NESTED 是唯一基于 savepoint 的傳播行為,其他的都是基于 Connection 的 commit/rollback。

4. 為什么自調(diào)用(this.method())事務(wù)會失效?

因?yàn)?strong>代理只對外部調(diào)用有效。

@Service
public class UserService {

    @Transactional
    public void outer() {
        // 這里有事務(wù)
        inner();           // ← this.inner() 直接調(diào)用原始對象的方法 → 繞過代理 → 無事務(wù)
    }

    @Transactional
    public void inner() {
        // 期望有事務(wù),但實(shí)際沒有(自調(diào)用場景)
    }
}

解決辦法(任選其一):

  • 用 @Transactional 的類注入自己(不推薦,循環(huán)依賴)
  • 用 AopContext.currentProxy()(需開啟 exposeProxy=true)
  • 把 inner 抽到另一個(gè) @Service 類里(最推薦)
  • 用編程式事務(wù) TransactionTemplate

5. 線程安全 & 資源綁定核心 —— TransactionSynchronizationManager

這是一個(gè)ThreadLocal大管家,里面存了:

  • 當(dāng)前線程的 Connection / Session / TransactionStatus
  • 資源是否只讀
  • 事務(wù)同步器列表(可以注冊回調(diào):beforeCommit、afterCommit、afterCompletion 等)

幾乎所有事務(wù)相關(guān)的操作最終都會走到這里取/放資源。

總結(jié)一句話

Spring 事務(wù)的實(shí)現(xiàn)可以濃縮為:

“用動態(tài)代理(AOP)攔截方法 → 根據(jù) @Transactional 屬性通過 PlatformTransactionManager 在 ThreadLocal 中綁定/管理數(shù)據(jù)庫連接和事務(wù)狀態(tài) → 在方法正常結(jié)束或異常時(shí)統(tǒng)一 commit/rollback”。

最核心的兩句話:

  • 沒有 AOP 動態(tài)代理 → 就沒有聲明式事務(wù)
  • 沒有 PlatformTransactionManager → 就沒有真正的事務(wù)控制(Spring 只做協(xié)調(diào))

如果你想更深入看某一塊(比如 savepoint 實(shí)現(xiàn)細(xì)節(jié)、DataSourceTransactionManager 源碼、Reactive 事務(wù)區(qū)別、多數(shù)據(jù)源切換等),可以告訴我,我可以繼續(xù)拆更細(xì)。

到此這篇關(guān)于spring 事務(wù)實(shí)現(xiàn)的示例的文章就介紹到這了,更多相關(guān)spring 事務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一次"java:程序包org.aspectj.lang不存在"問題解決實(shí)戰(zhàn)記錄

    一次"java:程序包org.aspectj.lang不存在"問題解決實(shí)戰(zhàn)記錄

    這篇文章主要給大家介紹了一次"java:程序包org.aspectj.lang不存在"問題解決的實(shí)戰(zhàn)過程,這個(gè)錯誤提示意味著你的Java程序中引用了org.aspectj.lang這個(gè)包,但是該包并不存在,文章通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • 淺析Java中SimpleDateFormat為什么是線程不安全的

    淺析Java中SimpleDateFormat為什么是線程不安全的

    SimpleDateFormat是Java中用于日期時(shí)間格式化的一個(gè)類,它提供了對日期的解析和格式化能力,本文主要來和大家一起探討一下SimpleDateFormat為什么是線程不安全的,感興趣的可以了解下
    2024-02-02
  • 淺談Java實(shí)現(xiàn)分布式事務(wù)的三種方案

    淺談Java實(shí)現(xiàn)分布式事務(wù)的三種方案

    現(xiàn)在互聯(lián)網(wǎng)下,分布式和微服務(wù)橫行,難免會遇到分布式下的事務(wù)問題,當(dāng)然微服務(wù)下可能沒有分布式事務(wù),但是很多場景是需要分布式事務(wù)的。下面就來介紹下什么是分布式事務(wù)和分布式事務(wù)的解決方案
    2021-06-06
  • Java中關(guān)于字符串的編碼方式

    Java中關(guān)于字符串的編碼方式

    這篇文章主要介紹了Java中關(guān)于字符串的編碼方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • MybatisPlus多條件?or()的使用問題小結(jié)

    MybatisPlus多條件?or()的使用問題小結(jié)

    這篇文章主要介紹了MybatisPlus多條件?or()的使用問題小結(jié),本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • Java如何獲取枚舉類型的值

    Java如何獲取枚舉類型的值

    這篇文章主要介紹了Java如何獲取枚舉類型的值問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • spring cloud gateway全局過濾器實(shí)現(xiàn)向request header中放數(shù)據(jù)

    spring cloud gateway全局過濾器實(shí)現(xiàn)向request header中放數(shù)據(jù)

    這篇文章主要介紹了spring cloud gateway全局過濾器實(shí)現(xiàn)向request header中放數(shù)據(jù)的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • JDK8環(huán)境中使用struts2的步驟詳解

    JDK8環(huán)境中使用struts2的步驟詳解

    這篇文章主要給大家介紹了關(guān)于在JDK8環(huán)境中使用struts2的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • java String、StringBuilder和StringBuffer的區(qū)別詳解

    java String、StringBuilder和StringBuffer的區(qū)別詳解

    這篇文章主要介紹了java String、StringBuilder和StringBuffer的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • eclipse實(shí)現(xiàn)ECDSA數(shù)字簽名

    eclipse實(shí)現(xiàn)ECDSA數(shù)字簽名

    這篇文章主要為大家詳細(xì)介紹了eclipse實(shí)現(xiàn)ECDSA數(shù)字簽名,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06

最新評論

孝感市| 乌兰察布市| 河北省| 蓬溪县| 黄骅市| 宝应县| 阿瓦提县| 新平| 许昌县| 洛川县| 白朗县| 新郑市| 黑山县| 枞阳县| 武隆县| 九江市| 维西| 汽车| 新闻| 容城县| 太仓市| 工布江达县| 崇明县| 安仁县| 保德县| 五家渠市| 城步| 三江| 玉溪市| 泸定县| 苏州市| 长宁县| 包头市| 襄樊市| 河西区| 宜兴市| 永胜县| 江西省| 桐柏县| 囊谦县| 寿光市|