欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring Boot 事務詳解(事務傳播行為、事務屬性)

 更新時間:2025年05月20日 11:55:15   作者:Dong雨  
Spring Boot 提供了強大的事務管理功能,通過 @Transactional 注解可以方便地配置事務的傳播行為和屬性,本文將詳細介紹 Spring Boot 中的事務管理,包括事務傳播行為、事務屬性以及聲明式和編程式事務管理,感興趣的朋友一起看看吧

Spring Boot 事務詳解

引言

在現(xiàn)代應用程序中,事務管理是確保數(shù)據(jù)一致性和完整性的重要機制。Spring Boot 提供了強大的事務管理功能,使得開發(fā)者可以輕松地定義和管理事務。本文將詳細介紹 Spring Boot 中的事務管理,包括事務傳播行為、事務屬性以及聲明式和編程式事務管理。

聲明式事務管理

聲明式事務管理是通過注解的方式來管理事務,最常用的注解是 @Transactional。這種方式簡單直觀,適合大多數(shù)場景。

示例

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class UserService {
    @Transactional
    public void createUser(User user) {
        // 數(shù)據(jù)庫操作
    }
}

編程式事務管理

編程式事務管理是通過編程的方式來手動控制事務,通常使用 PlatformTransactionManagerTransactionTemplate。

示例

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
@Service
public class UserService {
    @Autowired
    private PlatformTransactionManager transactionManager;
    public void createUser(User user) {
        DefaultTransactionDefinition def = new DefaultTransactionDefinition();
        def.setName("createUserTransaction");
        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
        TransactionStatus status = transactionManager.getTransaction(def);
        try {
            // 數(shù)據(jù)庫操作
            transactionManager.commit(status);
        } catch (Exception e) {
            transactionManager.rollback(status);
            throw e;
        }
    }
}

事務傳播行為

事務傳播行為定義了當一個事務方法調(diào)用另一個事務方法時,事務如何傳播。Spring 提供了多種傳播行為,可以通過 @Transactional 注解進行配置。以下是 Spring 支持的傳播行為及其使用場景:

1. REQUIRED

定義:如果當前存在事務,則加入該事務;如果當前沒有事務,則創(chuàng)建一個新的事務。

使用場景:大多數(shù)業(yè)務操作都使用該傳播行為,因為它確保了調(diào)用鏈上的所有操作都在同一個事務中。

示例

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
    // 業(yè)務邏輯
}

事務傳播示意圖

+--------+              +--------+
|  方法A  |              |  方法B  |
|        |--------------->        |
|        | 傳播事務 T1    |        |
+--------+              +--------+

2. SUPPORTS

定義:如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務方式執(zhí)行。

使用場景:適用于可選的事務操作,例如只讀查詢。

示例

@Transactional(propagation = Propagation.MANDATORY)
public void methodC() {
    // 業(yè)務邏輯
}

事務傳播示意圖

+--------+              +--------+
|  方法A  |              |  方法C  |
|        |--------------->        |
|        | 傳播事務 T1    |        |
+--------+              +--------+

3. MANDATORY

定義:如果當前存在事務,則加入該事務;如果當前沒有事務,則拋出異常。

使用場景:用于強制要求在事務環(huán)境中執(zhí)行的方法。

示例

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodD() {
    // 業(yè)務邏輯
}

事務傳播示意圖

+--------+              +--------+
|  方法A  |              |  方法C  |
|        |--------------->        |
|        | 傳播事務 T1    |        |
+--------+              +--------+

4. REQUIRES_NEW

定義:創(chuàng)建一個新的事務,如果當前存在事務,則將當前事務掛起。

使用場景:適用于必須在一個新事務中執(zhí)行的操作,例如獨立的日志記錄。

示例

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodD() {
    // 業(yè)務邏輯
}

事務傳播示意圖

+--------+              +--------+
|  方法A  |              |  方法D  |
|        |------------->|        |
| 掛起事務 T1           | 創(chuàng)建事務 T2 |
+--------+              +--------+

5. NOT_SUPPORTED

定義:以非事務方式執(zhí)行操作,如果當前存在事務,則將當前事務掛起。

使用場景:適用于不需要事務的操作,例如批量數(shù)據(jù)處理。

示例

@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void methodE() {
    // 業(yè)務邏輯
}

事務傳播示意圖

+--------+              +--------+
|  方法A  |              |  方法E  |
|        |------------->|        |
| 掛起事務 T1           | 非事務執(zhí)行 |
+--------+              +--------+

6. NEVER

定義:以非事務方式執(zhí)行,如果當前存在事務,則拋出異常。

使用場景:用于強制要求以非事務方式執(zhí)行的方法。

示例

@Transactional(propagation = Propagation.NEVER)
public void methodF() {
    // 業(yè)務邏輯
}

事務傳播示意圖

+--------+              +--------+
|  方法A  |              |  方法F  |
|        |------------->|        |
|        | 如果存在事務 T1,拋異常 |
+--------+              +--------+

7. NESTED

定義:如果當前存在事務,則在嵌套事務內(nèi)執(zhí)行;如果當前沒有事務,則行為與 REQUIRED 類似。

使用場景:適用于需要在主事務中執(zhí)行的子事務,例如復雜的數(shù)據(jù)庫操作。

示例

@Transactional(propagation = Propagation.NESTED)
public void methodG() {
    // 業(yè)務邏輯
}

事務傳播示意圖

+--------+              +--------+
|  方法A  |              |  方法G  |
|        |------------->|        |
| 事務 T1             | 嵌套事務 T1.1 |
+--------+              +--------+

事務失效情況

Spring Boot 通過 Spring 框架的事務管理模塊來支持事務操作。事務管理在 Spring Boot 中通常是通過 @Transactional 注解來實現(xiàn)的。以下是一些常見的事務失效情況:

1. 未捕獲異常

如果一個事務方法中發(fā)生了未捕獲的異常,并且異常未被處理或傳播到事務邊界之外,那么事務會失效,所有的數(shù)據(jù)庫操作會回滾。

2. 非受檢異常

默認情況下,Spring 對非受檢異常(RuntimeException 或其子類)進行回滾處理,這意味著當事務方法中拋出這些異常時,事務會回滾。

3. 事務傳播屬性設置不當

如果在多個事務之間存在事務嵌套,且事務傳播屬性配置不正確,可能導致事務失效。特別是在方法內(nèi)部調(diào)用有 @Transactional 注解的方法時要特別注意。

4. 多數(shù)據(jù)源的事務管理

如果在使用多數(shù)據(jù)源時,事務管理沒有正確配置或者存在多個 @Transactional 注解時,可能會導致事務失效。

5. 跨方法調(diào)用事務問題

如果一個事務方法內(nèi)部調(diào)用另一個方法,而這個被調(diào)用的方法沒有 @Transactional 注解,這種情況下外層事務可能會失效。

6. 事務在非公開方法中失效

如果 @Transactional 注解標注在私有方法上或者非 public 方法上,事務也會失效。

7. 使用this調(diào)用事務方法

Spring 事務是通過代理對象來控制的,只有通過代理對象的方法調(diào)用才會應用事務管理的相關規(guī)則。當使用 this 直接調(diào)用時,是繞過了 Spring 的代理機制,因此不會應用事務設置。

回滾條件

1. 自動回滾事務

  • 拋出未檢查異常(RuntimeException 及其子類),例如:NullPointerException 等。

2. 不會自動回滾

  • 默認情況下,檢查異常(如 IOExceptionSQLException 等)不會觸發(fā)回滾??梢酝ㄟ^ @Transactional 注解的 rollbackFor 屬性配置回滾:

示例

@Transactional(rollbackFor = IOException.class)
public void methodH() {
    // 業(yè)務邏輯
}

事務屬性

除了傳播行為,Spring 還提供了一些其他事務屬性,可以通過 @Transactional 注解進行配置。

1. 隔離級別

隔離級別定義了一個事務與其他事務隔離的程度。Spring 支持以下幾種隔離級別:

  • DEFAULT:使用數(shù)據(jù)庫默認的隔離級別。
  • READ_UNCOMMITTED:讀未提交的變更。
  • READ_COMMITTED:讀已提交的變更。
  • REPEATABLE_READ:可重復讀。
  • SERIALIZABLE:串行化。

示例

@Transactional(isolation = Isolation.READ_COMMITTED)
public void methodI() {
    // 業(yè)務邏輯
}

2. 事務超時

事務超時定義了事務在回滾之前可以運行的最長時間(以秒為單位)。

示例

@Transactional(timeout = 30)
public void methodJ() {
    // 業(yè)務邏輯
}

3. 只讀事務

只讀事務用于優(yōu)化只讀操作。設置為只讀的事務可以提示數(shù)據(jù)庫引擎進行某些優(yōu)化。

示例

@Transactional(readOnly = true)
public void methodK() {
    // 業(yè)務邏輯
}

4. 回滾規(guī)則

通過 rollbackFornoRollbackFor 屬性可以指定哪些異常會觸發(fā)事務回滾,哪些不會。

示例

@Transactional(rollbackFor = Exception.class)
public void methodL() {
    // 業(yè)務邏輯
}

常見面試題解析

1. 什么是事務傳播行為?Spring 提供了哪些事務傳播行為?

:事務傳播行為定義了當一個事務方法調(diào)用另一個事務方法時,事務如何傳播。Spring 提供了以下事務傳播行為:REQUIRED、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER、NESTED。

2. 如何配置事務的隔離級別?Spring 提供了哪些隔離級別?

:可以通過 @Transactional 注解的 isolation 屬性配置事務的隔離級別。Spring 提供了以下隔離級別:DEFAULT、READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ、SERIALIZABLE。

3. 什么是只讀事務?如何配置?

:只讀事務用于優(yōu)化只讀操作??梢酝ㄟ^ @Transactional 注解的 readOnly 屬性配置只讀事務。例如:@Transactional(readOnly = true)。

4. 如何配置事務的超時時間?

:可以通過 @Transactional 注解的 timeout 屬性配置事務的超時時間(以秒為單位)。例如:@Transactional(timeout = 30)。

5. 如何指定哪些異常會觸發(fā)事務回滾?

:可以通過 @Transactional 注解的 rollbackFor 屬性指定哪些異常會觸發(fā)事務回滾。例如:@Transactional(rollbackFor = Exception.class)。

總結

Spring Boot 提供了強大的事務管理功能,通過 @Transactional 注解可以方便地配置事務的傳播行為和屬性。理解和合理應用這些配置,可以有效地提高應用程序的數(shù)據(jù)一致性和完整性。

到此這篇關于Spring Boot 事務詳解(事務傳播行為、事務屬性)的文章就介紹到這了,更多相關Spring Boot 事務內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java編程訪問權限的控制代碼詳解

    Java編程訪問權限的控制代碼詳解

    這篇文章主要介紹了Java編程訪問權限的控制代碼詳解,涉及包名,公共的和私有的等相關內(nèi)容,分享了相關代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • Java獲得元素屬性的注解信息的步驟

    Java獲得元素屬性的注解信息的步驟

    在Java編程中,注解是一種為代碼添加元數(shù)據(jù)的方式,通過反射機制,我們可以獲取元素屬性上的注解信息,這個過程對于框架開發(fā)和元數(shù)據(jù)處理非常有用,能夠?qū)崿F(xiàn)更靈活的功能,對java獲得元素屬性的注解信息相關知識感興趣的朋友一起看看吧
    2024-09-09
  • 關于阿里巴巴TransmittableThreadLocal使用解讀

    關于阿里巴巴TransmittableThreadLocal使用解讀

    文章主要介紹了三種ThreadLocal的使用:ThreadLocal、InheritableThreadLocal和TransmittableThreadLocal,ThreadLocal和InheritableThreadLocal在單線程和部分情況下可以正常工作,但TransmittableThreadLocal在處理線程池時表現(xiàn)更佳
    2025-02-02
  • java實現(xiàn)微信公眾平臺自定義菜單的創(chuàng)建示例

    java實現(xiàn)微信公眾平臺自定義菜單的創(chuàng)建示例

    這篇文章主要介紹了java實現(xiàn)微信公眾平臺自定義菜單的創(chuàng)建示例,需要的朋友可以參考下
    2014-04-04
  • Java網(wǎng)絡編程TCP實現(xiàn)聊天功能

    Java網(wǎng)絡編程TCP實現(xiàn)聊天功能

    這篇文章主要為大家詳細介紹了Java網(wǎng)絡編程TCP實現(xiàn)聊天功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • JavaSE圖像驗證碼簡單識別程序詳解

    JavaSE圖像驗證碼簡單識別程序詳解

    這篇文章主要為大家詳細介紹了JavaSE圖像驗證碼簡單識別程序,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • IDEA配置Gradle及Gradle安裝的實現(xiàn)步驟

    IDEA配置Gradle及Gradle安裝的實現(xiàn)步驟

    本文主要介紹了IDEA配置Gradle及Gradle安裝的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-08-08
  • JVM完全解讀之YGC來龍去脈分析

    JVM完全解讀之YGC來龍去脈分析

    YGC是JVM?GC當前最為頻繁的一種GC,一個高并發(fā)的服務在運行期間,會進行大量的YGC,發(fā)生YGC時,會進行STW,一般時間都很短,除非碰到YGC時,存在大量的存活對象需要進行拷貝
    2022-01-01
  • SpringBoot導入mail依賴報錯問題解決

    SpringBoot導入mail依賴報錯問題解決

    這篇文章主要介紹了SpringBoot導入mail依賴報錯問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • 詳細分析Java并發(fā)集合ArrayBlockingQueue的用法

    詳細分析Java并發(fā)集合ArrayBlockingQueue的用法

    這篇文章主要介紹了詳細分析Java并發(fā)集合ArrayBlockingQueue的用法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04

最新評論