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

Spring的基礎(chǔ)事務(wù)注解@Transactional作用解讀

 更新時(shí)間:2025年09月26日 14:09:27   作者:嚯呀怪怪怪  
文章介紹了Spring框架中的事務(wù)管理,核心注解@Transactional用于聲明事務(wù),支持傳播機(jī)制、隔離級(jí)別等配置,結(jié)合@TransactionalEventListener實(shí)現(xiàn)事務(wù)事件監(jiān)聽,可在事務(wù)提交后執(zhí)行后續(xù)操作,如郵件通知和日志記錄,通過合理選擇事務(wù)相位和異步處理,提升系統(tǒng)可靠性與解耦性

一、事務(wù)管理基礎(chǔ)

1.1 Spring事務(wù)的核心注解

在Spring框架中,@Transactional是聲明式事務(wù)管理的核心注解。通過在方法或類上添加此注解,開發(fā)者可以將數(shù)據(jù)庫操作納入事務(wù)管理,確保數(shù)據(jù)一致性。

基本用法示例

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    @Transactional
    public User registerUser(String username, String email) {
        User user = new User(username, email);
        return userRepository.save(user);
    }

}

1.2 注解屬性詳解

@Transactional支持豐富的配置屬性:

  • propagation:事務(wù)傳播機(jī)制(默認(rèn)REQUIRED
  • isolation:隔離級(jí)別(默認(rèn)DEFAULT
  • rollbackFor:指定觸發(fā)回滾的異常類型
  • timeout:事務(wù)超時(shí)時(shí)間

多配置示例

@Transactional(
    propagation = Propagation.REQUIRES_NEW,
    isolation = Isolation.READ_COMMITTED,
    rollbackFor = {SQLException.class},
    timeout = 30
)
public void updateUserProfile(User user) {
    // 業(yè)務(wù)邏輯
}

1.3 實(shí)現(xiàn)原理

Spring通過AOP代理實(shí)現(xiàn)事務(wù)管理,在方法執(zhí)行前開啟事務(wù),結(jié)束后根據(jù)結(jié)果提交或回滾。關(guān)鍵的PlatformTransactionManager負(fù)責(zé)具體的事務(wù)操作。

二、事務(wù)事件監(jiān)聽器

2.1 事件驅(qū)動(dòng)架構(gòu)

Spring的事件機(jī)制基于觀察者模式,主要包含:

  1. 事件類(擴(kuò)展ApplicationEvent
  2. 事件發(fā)布者(ApplicationEventPublisher
  3. 事件監(jiān)聽器(@EventListener

2.2 傳統(tǒng)監(jiān)聽器的局限

默認(rèn)的@EventListener在事件發(fā)布時(shí)立即執(zhí)行,可能導(dǎo)致以下問題:

  • 主事務(wù)未提交時(shí)讀取到未持久化的數(shù)據(jù)
  • 業(yè)務(wù)操作與后續(xù)處理強(qiáng)耦合

2.3 @TransactionalEventListener解決方案

該注解將事件處理綁定到事務(wù)的不同階段,提供四種相位選擇:

  • AFTER_COMMIT:事務(wù)成功提交后(默認(rèn))
  • AFTER_ROLLBACK:事務(wù)回滾后
  • AFTER_COMPLETION:事務(wù)完成后(包含提交和回滾)
  • BEFORE_COMMIT:事務(wù)提交前

相位對(duì)比表

相位執(zhí)行時(shí)機(jī)典型場(chǎng)景
AFTER_COMMIT事務(wù)成功提交后發(fā)送通知、日志記錄
AFTER_ROLLBACK事務(wù)回滾后失敗補(bǔ)償處理
BEFORE_COMMIT事務(wù)提交前最后校驗(yàn)操作

三、用戶注冊(cè)場(chǎng)景示例

3.1 場(chǎng)景說明

實(shí)現(xiàn)用戶注冊(cè)功能:

  1. 保存用戶數(shù)據(jù)(事務(wù)操作)
  2. 發(fā)送歡迎郵件(事務(wù)提交后執(zhí)行)
  3. 記錄注冊(cè)日志(事務(wù)提交后執(zhí)行)

3.2 事件定義

public class UserRegisteredEvent extends ApplicationEvent {
    private final User user;

    public UserRegisteredEvent(Object source, User user) {
        super(source);
        this.user = user;
    }
    
    public User getUser() {
        return user;
    }

}

3.3 服務(wù)層實(shí)現(xiàn)

@Service
public class RegistrationService {
    @Autowired
    private UserRepository userRepository;
    @Autowired
    private ApplicationEventPublisher eventPublisher;

    @Transactional
    public User registerUser(String username, String email) {
        User newUser = userRepository.save(new User(username, email));
        // 發(fā)布領(lǐng)域事件
        eventPublisher.publishEvent(new UserRegisteredEvent(this, newUser));
        return newUser;
    }

}

3.4 事件監(jiān)聽器

@Component
public class RegistrationListeners {
    

    // 郵件服務(wù)監(jiān)聽器
    @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
    public void handleEmailNotification(UserRegisteredEvent event) {
        User user = event.getUser();
        System.out.println("發(fā)送郵件至:" + user.getEmail());
        // 實(shí)際應(yīng)調(diào)用郵件服務(wù)
    }
    
    // 日志記錄監(jiān)聽器(新事務(wù))
    @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void auditLog(UserRegisteredEvent event) {
        System.out.println("記錄審計(jì)日志:" + event.getUser());
        // 日志存儲(chǔ)操作將使用獨(dú)立事務(wù)
    }

}

四、關(guān)鍵機(jī)制解析

4.1 執(zhí)行流程

  1. registerUser()方法開啟事務(wù)
  2. 用戶數(shù)據(jù)保存到數(shù)據(jù)庫(未提交)
  3. 事件發(fā)布到上下文
  4. 事務(wù)提交成功
  5. 監(jiān)聽器被觸發(fā)執(zhí)行

4.2 異常處理策略

  • 主事務(wù)回滾:所有AFTER_COMMIT監(jiān)聽器不會(huì)執(zhí)行
  • 監(jiān)聽器拋出異常:默認(rèn)不影響已提交的主事務(wù),需單獨(dú)處理

增強(qiáng)型異常處理

@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
public void handleEvent(MyEvent event) {
    try {
        // 業(yè)務(wù)邏輯
    } catch (Exception e) {
        // 記錄異常或進(jìn)行補(bǔ)償
        logger.error("事件處理失敗", e);
        retryService.scheduleRetry(event);
    }
}

4.3 與@EventListener的對(duì)比

特性@TransactionalEventListener@EventListener
執(zhí)行時(shí)機(jī)事務(wù)相位控制立即執(zhí)行
事務(wù)關(guān)聯(lián)性與主事務(wù)協(xié)同獨(dú)立上下文
數(shù)據(jù)一致性保證提交后處理可能讀取未提交數(shù)據(jù)
適用場(chǎng)景后續(xù)處理操作實(shí)時(shí)響應(yīng)操作

五、最佳實(shí)踐建議

相位選擇原則

  • 優(yōu)先使用AFTER_COMMIT確保數(shù)據(jù)最終一致性
  • 謹(jǐn)慎使用BEFORE_COMMIT,避免影響主事務(wù)

監(jiān)聽器設(shè)計(jì)規(guī)范

@Async
@TransactionalEventListener
public void asyncHandleEvent(MyEvent event) {
    // 異步處理
}
  • 保持監(jiān)聽器職責(zé)單一
  • 處理耗時(shí)操作應(yīng)異步化

事務(wù)傳播控制

  • 需要數(shù)據(jù)持久化時(shí)使用REQUIRES_NEW
  • 只讀操作使用SUPPORTS

調(diào)試技巧

啟用事務(wù)日志:

logging.level.org.springframework.transaction=DEBUG

使用TransactionSynchronizationManager驗(yàn)證事務(wù)狀態(tài)

六、總結(jié)

@Transactional@TransactionalEventListener的組合為Spring應(yīng)用提供了完善的事務(wù)管理方案:前者確保核心業(yè)務(wù)的數(shù)據(jù)一致性,后者實(shí)現(xiàn)事務(wù)敏感的后續(xù)處理。

通過合理運(yùn)用這兩個(gè)注解,開發(fā)者可以構(gòu)建出松耦合、高可靠性的系統(tǒng)架構(gòu)。在實(shí)際項(xiàng)目中,建議根據(jù)業(yè)務(wù)需求選擇合適的事務(wù)相位,并結(jié)合異步處理提升系統(tǒng)性能。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java自定義類加載器實(shí)現(xiàn)類隔離詳解

    Java自定義類加載器實(shí)現(xiàn)類隔離詳解

    由于每種組件的不同版本所依賴的jar包不同,我們可以借鑒tomcat的實(shí)現(xiàn)方式,通過自定義類加載器打破雙親委派機(jī)制來實(shí)現(xiàn)類隔離,從而達(dá)到操作多組件多版本的目的。本文就來和大家詳細(xì)聊聊實(shí)現(xiàn)方法
    2023-03-03
  • Java使用ant.jar執(zhí)行SQL腳本文件的示例代碼

    Java使用ant.jar執(zhí)行SQL腳本文件的示例代碼

    這篇文章主要介紹了Java使用ant.jar執(zhí)行SQL腳本文件,文中通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-02-02
  • 在MyBatis-Plus中關(guān)閉SQL日志輸出的方法

    在MyBatis-Plus中關(guān)閉SQL日志輸出的方法

    在使用MyBatis-Plus開發(fā)Java應(yīng)用程序時(shí),隨著項(xiàng)目的復(fù)雜性提升,SQL日志的輸出可能會(huì)導(dǎo)致日志文件變得龐大,影響系統(tǒng)的性能和可維護(hù)性,本文將介紹如何在Spring Boot項(xiàng)目中關(guān)閉MyBatis-Plus的SQL日志輸出,感興趣的朋友一起看看吧
    2025-04-04
  • jsch中ChannelShell與ChannelExec的區(qū)別及說明

    jsch中ChannelShell與ChannelExec的區(qū)別及說明

    這篇文章主要介紹了jsch中ChannelShell與ChannelExec的區(qū)別及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 創(chuàng)建自定義的Java注解類的方法

    創(chuàng)建自定義的Java注解類的方法

    這篇文章主要介紹了創(chuàng)建自定義的Java注解類的方法,主要部分為創(chuàng)建一個(gè)帶有Java類型@interface的新類型,需要的朋友可以參考下
    2015-07-07
  • Java使用橋接模式實(shí)現(xiàn)開關(guān)和電燈照明功能詳解

    Java使用橋接模式實(shí)現(xiàn)開關(guān)和電燈照明功能詳解

    這篇文章主要介紹了Java使用橋接模式實(shí)現(xiàn)開關(guān)和電燈照明功能,較為詳細(xì)的講述了橋接模式的概念、原理并結(jié)合實(shí)例形式分析了Java使用橋接模式實(shí)現(xiàn)開關(guān)和電燈照明功能相關(guān)操作步驟與注意事項(xiàng),需要的朋友可以參考下
    2018-05-05
  • 詳解SpringBoot自定義配置與整合Druid

    詳解SpringBoot自定義配置與整合Druid

    Druid是alibaba開源平臺(tái)上一個(gè)數(shù)據(jù)庫連接池實(shí)現(xiàn),結(jié)合了C3P0,DBCP等DB池的優(yōu)點(diǎn),同時(shí)也有Web監(jiān)控界面。這篇文章主要介紹了Java之SpringBoot自定義配置與整合Druid的相關(guān)知識(shí),需要的朋友可以參考下
    2021-09-09
  • SpringBoot整合flowable及其簡單的使用實(shí)例教程

    SpringBoot整合flowable及其簡單的使用實(shí)例教程

    Flowable是一個(gè)輕量級(jí)的Java開源業(yè)務(wù)流程引擎,支持BPMN2.0規(guī)范,提供流程定義、部署、任務(wù)管理、事件處理、表單管理、監(jiān)控和身份管理等功能,本文介紹了Flowable的核心組件、實(shí)現(xiàn)類、使用場(chǎng)景以及Spring Boot整合Flowable的步驟,包括配置和測(cè)試流程,感興趣的朋友一起看看吧
    2025-12-12
  • 淺析JAVA Lock鎖原理

    淺析JAVA Lock鎖原理

    這篇文章主要介紹了JAVA Lock鎖原理的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • springboot跨域CORS處理代碼解析

    springboot跨域CORS處理代碼解析

    這篇文章主要介紹了springboot跨域CORS處理代碼解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12

最新評(píng)論

宁南县| 大方县| 湖州市| 聂荣县| 宁安市| 察隅县| 正蓝旗| 江津市| 左贡县| 罗江县| 黔西| 黎川县| 马山县| 芒康县| 邵阳市| 遵义县| 南宫市| 沁源县| 新安县| 黎川县| 九寨沟县| 南阳市| 镇原县| 乐昌市| 扎鲁特旗| 含山县| 卓资县| 湖州市| 达日县| 信阳市| 集安市| 天柱县| 疏勒县| 闽清县| 花垣县| 西城区| 隆回县| 江陵县| 宁远县| 疏勒县| 贵德县|