深入淺出Spring事務傳播機制

一、事務概念

事務是指作為單個邏輯工作單元執行的一系列操作,所有操作要麼全部成功完成,要麼全部失敗而回滾。在關係型資料庫中,事務通常是指一系列的數據操作,比如增刪改查等。

二、Spring事務管理器

Spring事務管理器是Spring框架提供的一個事務管理的通用介面。Spring事務管理器可以與多種事務管理機制進行集成,包括JDBC事務、JTA事務和Hibernate事務等。

@Configuration
@EnableTransactionManagement
public class AppConfig {
    @Bean
    public DataSource dataSource() {
        // 創建數據源
    }

    @Bean
    public PlatformTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dataSource());
    }
}

三、Spring事務傳播機制

Spring事務傳播機制是指在多個事務方法調用的嵌套情況下,事務如何進行傳播。

1、REQUIRED

REQUIRED是Spring默認的事務傳播機制。該機制會在當前事務不存在時,創建一個新的事務並在當前事務中執行。在當前事務中調用其他方法時,調用的方法將在當前事務中執行。

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
    // do something
    methodB();
}

@Transactional(propagation = Propagation.REQUIRED)
public void methodB() {
    // do something
}

2、SUPPORTS

SUPPORTS是指當前調用方法如果已經在事務中,則直接加入該事務,否則以非事務的方式執行。如果調用的方法沒有事務,則當前方法也不會創建事務,以非事務的方式執行。

@Transactional(propagation = Propagation.SUPPORTS)
public void methodA() {
    // do something
    methodB();
}

@Transactional(propagation = Propagation.SUPPORTS)
public void methodB() {
    // do something
}

3、MANDATORY

MANDATORY是指當前調用方法必須在一個事務中運行,否則將拋出異常。

@Transactional(propagation = Propagation.MANDATORY)
public void methodA() {
    // do something
    methodB();
}

@Transactional(propagation = Propagation.MANDATORY)
public void methodB() {
    // do something
}

4、REQUIRES_NEW

REQUIRES_NEW是指當前調用方法必須啟動一個新的事務,並在該事務中運行。如果當前存在事務,則將當前事務掛起並創建一個新的事務執行。

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodA() {
    // do something
    methodB();
}

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodB() {
    // do something
}

5、NOT_SUPPORTED

NOT_SUPPORTED是指當前調用方法不應該在事務中運行。如果當前存在事務,則將該事務掛起並以非事務的方式執行該方法。

@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void methodA() {
    // do something
    methodB();
}

@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void methodB() {
    // do something
}

6、NEVER

NEVER是指當前調用方法不應該在事務中運行。如果當前存在事務,則拋出異常。

@Transactional(propagation = Propagation.NEVER)
public void methodA() {
    // do something
    methodB();
}

@Transactional(propagation = Propagation.NEVER)
public void methodB() {
    // do something
}

7、NESTED

NESTED是指當前調用方法應該在一個嵌套事務中執行。如果當前不存在事務,則與REQUIRED傳播機制相同。如果當前存在事務,則在該事務的嵌套事務中執行。

@Transactional(propagation = Propagation.NESTED)
public void methodA() {
    // do something
    methodB();
}

@Transactional(propagation = Propagation.NESTED)
public void methodB() {
    // do something
}

四、總結

Spring事務傳播機制是Spring框架重要的一部分。在實際開發中,應該根據實際情況選擇合適的事務傳播機制,以保證事務的正確性和完整性。

原創文章,作者:YEPQW,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/370135.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
YEPQW的頭像YEPQW
上一篇 2025-04-18 13:40
下一篇 2025-04-18 13:40

相關推薦

發表回復

登錄後才能評論