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

Spring聲明式事務(wù)管理從原理到實(shí)戰(zhàn)示例

 更新時(shí)間:2025年11月01日 09:34:35   作者:lang20150928  
本文主要介紹了Spring聲明式事務(wù)管理的概念、實(shí)現(xiàn)原理、配置方法、異?;貪L機(jī)制、不同類的事務(wù)配置以及響應(yīng)式事務(wù)的支持,聲明式事務(wù)通過配置或注解簡化了事務(wù)管理,使用AOP實(shí)現(xiàn),支持多種傳播行為和隔離級(jí)別,感興趣的朋友跟隨小編一起看看吧

?? 一、什么是聲明式事務(wù)管理?

? 簡單說:

你不用在代碼里手動(dòng)寫 beginTransaction()、commit()、rollback(),而是通過配置或注解來告訴 Spring:“這個(gè)方法需要事務(wù)”,Spring 自動(dòng)幫你管理事務(wù)的開始、提交或回滾。

?? 對比:編程式 vs 聲明式

類型特點(diǎn)代碼侵入性
編程式事務(wù)手動(dòng)控制事務(wù)(如使用 TransactionTemplate高(代碼里到處是事務(wù)邏輯)
聲明式事務(wù)用配置或注解聲明事務(wù)行為低(業(yè)務(wù)代碼干凈)

?? Spring 推薦使用 聲明式事務(wù),因?yàn)樗?ldquo;輕量級(jí)容器”的理念 —— 業(yè)務(wù)代碼不依賴事務(wù)框架。

?? 二、聲明式事務(wù)是如何實(shí)現(xiàn)的?(核心原理)

Spring 的聲明式事務(wù)是基于 AOP(面向切面編程) 實(shí)現(xiàn)的。

?? 工作流程如下:

  1. 你有一個(gè)服務(wù)類,比如 DefaultFooService。
  2. 你在配置中聲明了哪些方法需要事務(wù)(通過 <tx:advice>@Transactional)。
  3. Spring 在啟動(dòng)時(shí),會(huì)為這個(gè)類創(chuàng)建一個(gè) 代理對象(Proxy)。
  4. 當(dāng)你調(diào)用 fooService.insertFoo(...) 時(shí),實(shí)際上是調(diào)用了代理對象的方法。
  5. 代理對象在方法執(zhí)行前開啟事務(wù),執(zhí)行后根據(jù)結(jié)果決定提交或回滾。
你調(diào)用:   fooService.insertFoo()
        ↓
實(shí)際執(zhí)行:  Proxy → 開啟事務(wù) → 調(diào)用真實(shí)方法 → 成功則提交,異常則回滾

??? 關(guān)鍵組件:

  • TransactionInterceptor:事務(wù)攔截器,負(fù)責(zé)在方法前后插入事務(wù)邏輯。
  • TransactionManager:事務(wù)管理器,真正執(zhí)行開啟、提交、回滾操作(如 DataSourceTransactionManager)。
  • AOP 代理:JDK 動(dòng)態(tài)代理 或 CGLIB,用于織入事務(wù)邏輯。

?? 三、如何配置聲明式事務(wù)?(XML 配置方式)

文檔中的例子使用 XML 配置,雖然現(xiàn)在更多用注解,但理解 XML 有助于理解底層機(jī)制。

示例配置解析:

<!-- 定義數(shù)據(jù)源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> ... </bean>
<!-- 定義事務(wù)管理器 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>
<!-- 定義事務(wù)通知(規(guī)則) -->
<tx:advice id="txAdvice" transaction-manager="txManager">
    <tx:attributes>
        <tx:method name="get*" read-only="true"/>  <!-- 所有g(shù)et開頭的方法:只讀事務(wù) -->
        <tx:method name="*" />                     <!-- 其他方法:默認(rèn)事務(wù)(讀寫) -->
    </tx:attributes>
</tx:advice>
<!-- 將事務(wù)通知應(yīng)用到指定的切點(diǎn) -->
<aop:config>
    <!-- 切點(diǎn):匹配 FooService 接口的所有方法 -->
    <aop:pointcut id="fooServiceOperation" 
                  expression="execution(* x.y.service.FooService.*(..))"/>
    <!-- 綁定通知和切點(diǎn) -->
    <aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceOperation"/>
</aop:config>

?? 關(guān)鍵點(diǎn):

  • tx:method name="get*":所有以 get 開頭的方法使用 只讀事務(wù)(性能優(yōu)化)。
  • tx:method name="*":其他方法使用默認(rèn)事務(wù)(讀寫)。
  • aop:pointcut 使用 AspectJ 表達(dá)式 匹配方法。

?? 四、事務(wù)回滾機(jī)制(Rollback Rules)

這是 Spring 事務(wù)的一大亮點(diǎn):你可以精確控制哪些異常觸發(fā)回滾。

默認(rèn)規(guī)則:

  • ? 運(yùn)行時(shí)異常(RuntimeException):自動(dòng)回滾(如 NullPointerException、IllegalArgumentException
  • ? 檢查型異常(Checked Exception)不回滾(如 IOException、自定義的 MyException

?? 這與 EJB CMT 不同!EJB 中檢查型異常也不回滾,但 Spring 允許你自定義。

自定義回滾規(guī)則:

1. 某個(gè)檢查型異常也要回滾:

<tx:method name="updateStock" rollback-for="NoProductInStockException"/>

2. 某個(gè)運(yùn)行時(shí)異常不要回滾:

<tx:method name="updateStock" no-rollback-for="InstrumentNotFoundException"/>

3. 多規(guī)則優(yōu)先級(jí):

<tx:method name="*" 
           rollback-for="Throwable" 
           no-rollback-for="InstrumentNotFoundException"/>

? 所有異常都回滾,除了 InstrumentNotFoundException。

?? 五、響應(yīng)式事務(wù)(Reactive Transaction Management)

Spring 5+ 支持響應(yīng)式編程(如 WebFlux),事務(wù)也支持響應(yīng)式。

關(guān)鍵區(qū)別:

特性傳統(tǒng)(Imperative)響應(yīng)式(Reactive)
返回類型Foo, voidMono<Foo>, Flux<Foo>
事務(wù)管理器PlatformTransactionManagerReactiveTransactionManager
事務(wù)傳播基于 ThreadLocal基于 Reactor Context
事務(wù)觸發(fā)方法調(diào)用立即開始返回的 Publisher 被訂閱時(shí)才開始

?? 響應(yīng)式事務(wù)是“惰性的”:調(diào)用方法不立即開啟事務(wù),而是等到 .subscribe() 時(shí)才開始。

??? 六、不同 Bean 使用不同事務(wù)配置

你可以為不同的服務(wù)類設(shè)置不同的事務(wù)規(guī)則。

示例:

<aop:pointcut id="defaultServiceOperation" 
              expression="execution(* x.y.service.*Service.*(..))"/>
<aop:pointcut id="noTxServiceOperation" 
              expression="execution(* x.y.service.ddl.DefaultDdlManager.*(..))"/>
<aop:advisor pointcut-ref="defaultServiceOperation" advice-ref="defaultTxAdvice"/>
<aop:advisor pointcut-ref="noTxServiceOperation" advice-ref="noTxAdvice"/>
  • *Service 類:使用默認(rèn)事務(wù)(可讀寫)
  • DefaultDdlManager 類:使用 propagation="NEVER"(禁止在事務(wù)中運(yùn)行)

?? 這很實(shí)用,比如 DDL 操作(建表、刪表)通常不應(yīng)在事務(wù)中運(yùn)行。

?? 七、<tx:method>的所有配置項(xiàng)總結(jié)

屬性是否必需默認(rèn)值說明
name? 是-方法名(支持 * 通配符)
propagationREQUIRED傳播行為(如 REQUIRED, REQUIRES_NEW, NEVER 等)
isolationDEFAULT隔離級(jí)別(如 READ_COMMITTED
timeout-1(無超時(shí))超時(shí)時(shí)間(秒)
read-onlyfalse是否只讀事務(wù)
rollback-for-哪些異常觸發(fā)回滾(可寫多個(gè),逗號(hào)分隔)
no-rollback-for-哪些異常觸發(fā)回滾

?? 八、重要注意事項(xiàng)

  • 代理機(jī)制限制
    • 只有 外部調(diào)用 代理對象的方法才會(huì)觸發(fā)事務(wù)。
    • 如果你在同一個(gè)類中調(diào)用 this.method()事務(wù)不會(huì)生效(因?yàn)闆]走代理)。
  • 事務(wù)不會(huì)跨遠(yuǎn)程調(diào)用
    • Spring 不支持像 EJB 那樣將事務(wù)上下文傳播到遠(yuǎn)程服務(wù)。
    • 如果你需要分布式事務(wù),考慮使用 SeataSpring Cloud Alibaba 等方案。
  • 異常必須拋出
    • 如果你在方法內(nèi)部 catch 了異常但沒有重新拋出,事務(wù)不會(huì)回滾。
    • 正確做法:catchthrow 或調(diào)用 setRollbackOnly()
  • @Transactional 注解更常用
    • 現(xiàn)代 Spring 開發(fā)通常使用 @Transactional 注解代替 XML。
  • 例如:
@Service
public class FooService {
    @Transactional(readOnly = true)
    public Foo getFoo(String name) { ... }
    @Transactional(rollbackFor = MyException.class)
    public void updateFoo(Foo foo) { ... }
}

需要啟用:@EnableTransactionManagement

? 總結(jié):如何理解這段內(nèi)容?

問題回答
聲明式事務(wù)是什么?用配置或注解聲明事務(wù),無需手動(dòng)控制。
怎么實(shí)現(xiàn)的?基于 AOP,Spring 創(chuàng)建代理對象,在方法前后自動(dòng)加事務(wù)邏輯。
怎么配置?<tx:advice> 定義規(guī)則,用 <aop:config> 應(yīng)用到目標(biāo)方法。
異常怎么回滾?默認(rèn)運(yùn)行時(shí)異常回滾,可通過 rollback-for 自定義。
不同類不同配置?可以,定義多個(gè) <tx:advice><aop:advisor>。
響應(yīng)式支持嗎?支持,基于 ReactiveTransactionManager 和 Reactor 上下文。

?? 建議學(xué)習(xí)路徑

  1. 先理解 AOP 基本概念(代理、切點(diǎn)、通知)
  2. 動(dòng)手寫一個(gè) XML 配置的聲明式事務(wù)例子
  3. 改造成 @Transactional 注解方式
  4. 嘗試 自定義回滾規(guī)則
  5. 了解 事務(wù)傳播行為(如 REQUIRED, REQUIRES_NEW
  6. (進(jìn)階)學(xué)習(xí) 響應(yīng)式事務(wù)分布式事務(wù)

如果你希望,我可以:

  • 把這個(gè)內(nèi)容轉(zhuǎn)成中文思維導(dǎo)圖
  • 寫一個(gè)完整的可運(yùn)行代碼示例(Java + Spring + 注解)
  • 解釋 @Transactional 的各種傳播行為

歡迎繼續(xù)提問!

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

相關(guān)文章

  • 解決SpringBoot整合ElasticSearch遇到的連接問題

    解決SpringBoot整合ElasticSearch遇到的連接問題

    這篇文章主要介紹了解決SpringBoot整合ElasticSearch遇到的連接問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java實(shí)現(xiàn)普通類注入service對象

    Java實(shí)現(xiàn)普通類注入service對象

    這篇文章主要介紹了Java實(shí)現(xiàn)普通類注入service對象,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 已解決:No ''Access-Control-Allow-Origin''跨域問題

    已解決:No ''Access-Control-Allow-Origin''跨域問題

    這篇文章主要介紹了已解決:No 'Access-Control-Allow-Origin' 跨域,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • 解析Java中的隊(duì)列和用LinkedList集合模擬隊(duì)列的方法

    解析Java中的隊(duì)列和用LinkedList集合模擬隊(duì)列的方法

    這篇文章主要介紹了解析Java中的隊(duì)列和用LinkedList集合模擬隊(duì)列的方法,相關(guān)算法的實(shí)現(xiàn)也是ACM中的常見題目,需要的朋友可以參考下
    2015-08-08
  • java整合微信支付功能詳細(xì)示例

    java整合微信支付功能詳細(xì)示例

    這篇文章主要給大家介紹了關(guān)于java整合微信支付功能的相關(guān)資料,支付是一個(gè)復(fù)雜且測試起來需要的配置特別復(fù)雜的模塊,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考下
    2023-07-07
  • MyBatis Mapper XML中比較操作符轉(zhuǎn)義問題解決

    MyBatis Mapper XML中比較操作符轉(zhuǎn)義問題解決

    在使用MyBatis編寫Mapper XML時(shí),有時(shí)會(huì)遇到比較操作符需要進(jìn)行轉(zhuǎn)義的情況,本文主要介紹了MyBatis Mapper XML中比較操作符轉(zhuǎn)義問題解決,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • java實(shí)現(xiàn)請求緩沖合并的示例代碼

    java實(shí)現(xiàn)請求緩沖合并的示例代碼

    我們對外提供了一個(gè)rest接口給第三方業(yè)務(wù)進(jìn)行調(diào)用,但是由于第三方框架限制,導(dǎo)致會(huì)發(fā)送大量相似無效請求,這篇文章主要介紹了java實(shí)現(xiàn)請求緩沖合并,需要的朋友可以參考下
    2024-04-04
  • java 遠(yuǎn)程文件url如何轉(zhuǎn)為輸入流

    java 遠(yuǎn)程文件url如何轉(zhuǎn)為輸入流

    這篇文章主要介紹了java 遠(yuǎn)程文件url如何轉(zhuǎn)為輸入流方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • java 字符串內(nèi)存分配的分析與總結(jié)(推薦)

    java 字符串內(nèi)存分配的分析與總結(jié)(推薦)

    下面小編就為大家?guī)硪黄猨ava 字符串內(nèi)存分配的分析與總結(jié)(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-08-08
  • Java程序開發(fā)環(huán)境配置圖文教程

    Java程序開發(fā)環(huán)境配置圖文教程

    這篇文章主要為大家詳細(xì)介紹了Java程序開發(fā)環(huán)境配置圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07

最新評論

青阳县| 禄劝| 延吉市| 金堂县| 磴口县| 蛟河市| 河间市| 阳曲县| 且末县| 洛浦县| 共和县| 景泰县| 京山县| 栖霞市| 互助| 米脂县| 舞阳县| 庄河市| 宜兰县| 独山县| 洪江市| 海淀区| 昂仁县| 柘城县| 天祝| 化州市| 磐石市| 江北区| 南京市| 仁化县| 密云县| 涡阳县| 沧源| 北碚区| 长武县| 明溪县| 江达县| 乌兰察布市| 武夷山市| 大兴区| 萝北县|