成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

不同的事務,在 Spring 中是如何傳播的?

開發
本文我們詳細分析了 Spring 事務傳播行為,掌握它們對于構建健壯的事務管理策略至關重要。

Spring 事務傳播行為(Propagation Behavior)定義了一個事務方法被另一個事務方法調用時事務的邊界和行為。這篇文章,我們將深度分析它們的原理以及對比它們之間的差異。

一、事務傳播行為概述

在 Spring 中,Propagation 枚舉類型定義了七種主要的事務傳播行為:

  • REQUIRED
  • REQUIRES_NEW
  • SUPPORTS
  • NOT_SUPPORTED
  • MANDATORY
  • NEVER
  • NESTED

此外,NESTED 傳播行為在某些數據源(如支持嵌套事務的數據庫)下可用。

二、原理分析

事務傳播行為主要決定了在一個事務方法被調用時,當前存在的事務(如果有)應該如何被處理。以下是其原理分析:

  • 事務的存在檢查:當一個方法(被調用者)執行時,它會檢查調用它的方法(調用者)是否存在活動事務。
  • 決定是否掛起、重用或創建新事務:根據傳播行為的不同,調用者可能會被掛起,或者調用者的方法可能會加入到現有事務中,或者開啟一個全新的事務。
  • 事務的邊界控制:傳播行為還控制了事務的提交和回滾邊界,確保在復雜調用鏈中事務的一致性與完整性。

三、各種傳播行為的示例分析

1. REQUIRED

定義:支持當前事務。如果沒有事務,就新建一個事務。

原理:調用者存在事務,方法加入到這個事務中;否則,開啟新事務。

示例:

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
    // 執行數據庫操作
    methodB();
}

@Transactional(propagation = Propagation.REQUIRED)
public void methodB() {
    // 執行數據庫操作
}

分析:methodA 開啟事務,methodB 加入到同一個事務中。如果 methodA 回滾,methodB 也會回滾。

2. REQUIRES_NEW

定義:新建事務,如果存在事務,就將當前事務掛起。

原理:無論調用者是否存在事務,方法都會開啟一個獨立的新事務。

示例:

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
    // 執行數據庫操作
    methodB();
}

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodB() {
    // 執行數據庫操作
}

分析:methodA 和 methodB 各自有獨立的事務。如果 methodB 回滾,不會影響 methodA 的事務。

3. SUPPORTS

定義:支持當前事務,如果存在事務,就加入;否則,以非事務方式執行。

原理:依賴調用者是否有事務,調用者有則參與事務,無則不使用事務。

示例:

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
    // 執行數據庫操作
    methodB();
}

@Transactional(propagation = Propagation.SUPPORTS)
public void methodB() {
    // 執行數據庫操作
}

分析:如果 methodA 調用 methodB,methodB 會參與 methodA 的事務。如果 methodB 被獨立調用,則以非事務方式執行。

4. NOT_SUPPORTED

定義:以非事務方式執行操作,如果存在事務,就將其掛起。

原理:方法不支持事務,即使調用者有事務,也不會參與。

示例:

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
    // 執行數據庫操作
    methodB();
}

@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void methodB() {
    // 執行數據庫操作
}

分析:methodA 的事務會在執行 methodB 時被掛起,methodB 以非事務方式執行,執行完畢后恢復 methodA 的事務。

5. MANDATORY

定義:支持當前事務,必須存在一個事務,否則拋出異常。

原理:如果調用者有事務,方法參與;否則,拋出 IllegalTransactionStateException。

示例:

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
    // 執行數據庫操作
    methodB();
}

@Transactional(propagation = Propagation.MANDATORY)
public void methodB() {
    // 執行數據庫操作
}

分析:當 methodA 調用 methodB 時,由于 methodA 有事務,methodB 可以正常參與事務。如果 methodB 被獨立調用,無事務,會拋出異常。

6. NEVER

定義:以非事務方式執行,如果存在事務,則拋出異常。

原理:方法絕不支持事務,確保其執行不在事務上下文中。

示例:

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
    // 執行數據庫操作
    methodB();
}

@Transactional(propagation = Propagation.NEVER)
public void methodB() {
    // 執行數據庫操作
}

分析:當 methodA 調用 methodB 時,由于 methodA 有事務,調用 methodB 會拋出異常。如果 methodB 被獨立調用,無事務,則正常執行。

7. NESTED

定義:如果存在事務,則在嵌套事務內執行;否則,類似于 REQUIRED。

原理:基于底層數據庫的保存點(savepoint),允許在嵌套事務中回滾到保存點,而不影響外部事務。

示例:

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
    // 執行數據庫操作
    methodB();
    // 繼續執行
}

@Transactional(propagation = Propagation.NESTED)
public void methodB() {
    // 執行數據庫操作
}

分析:如果 methodB 出現異常且事務被回滾,只會回滾到 methodB 的開始,而 methodA 的事務仍然可以繼續或回滾。

四、傳播行為對比

傳播行為

是否必須存在事務

是否開啟新事務

是否掛起現有事務

適用場景

REQUIRED




默認行為,絕大多數場景使用,如服務層方法。

REQUIRES_NEW




需要獨立事務,如日志記錄,不受外部事務影響。

SUPPORTS




可選事務性,讀操作等,既能在事務中也能在非事務中運行。

NOT_SUPPORTED




非事務操作,如與事務無關的外部系統交互。

MANDATORY




強制要求存在事務的操作,確保方法調用在事務環境中。

NEVER




確保方法在非事務環境中執行,避免事務上下文。

NESTED


基于底層支持


需要在事務內進行部分回滾的場景,如復雜業務操作。

關鍵差異點:

  • 是否開啟新事務:REQUIRES_NEW 和 NESTED 可以開啟新事務,其他大部分屬于參與現有事務或非事務。
  • 是否必須存在事務:MANDATORY 和 NEVER 針對事務的存在有嚴格要求。
  • 是否掛起現有事務:REQUIRES_NEW 和 NOT_SUPPORTED 會掛起當前事務。
  • 嵌套事務支持:NESTED 依賴于底層數據庫的 savepoint 支持,允許在同一事務中進行局部回滾。

五、實際應用中的選擇

  • 大多數場景:使用 REQUIRED 是最合適的選擇,因為它簡化了事務管理,并且大多數情況下方法需要參與到調用者的事務中。
  • 獨立事務需求:如日志記錄、發送通知等,需要與主事務獨立的操作,可以使用 REQUIRES_NEW。
  • 可選事務:對于既能在事務中運行也能在非事務中運行的操作,可以使用 SUPPORTS。
  • 確保非事務執行:若某操作必須在非事務環境下執行,如一些特定的外部系統調用,可以使用 NOT_SUPPORTED 或 NEVER。
  • 強制要求事務:在某些關鍵業務邏輯中,確保方法只能在事務中調用,可以使用 MANDATORY。
  • 局部回滾需求:在復雜業務場景下,需要對某部分操作進行局部回滾,可以考慮使用 NESTED,但需確保底層數據庫支持。

六、注意事項

  • 數據庫支持:部分傳播行為(如 NESTED)依賴于底層數據庫的支持,使用前需要確認數據庫和事務管理器的兼容性。
  • 事務管理器配置:正確配置 Spring 事務管理器(如 PlatformTransactionManager)對于事務傳播行為的正常工作至關重要。
  • 事務邊界設計:合理設計事務邊界,避免過長的事務導致資源占用和性能問題。

七、總結

本文,我們詳細分析了 Spring 事務傳播行為,掌握它們對于構建健壯的事務管理策略至關重要。通過合理選擇合適的傳播行為,可以確保在復雜的業務邏輯和調用鏈中,數據的一致性和系統的穩定性。開發人員應根據具體的業務需求和應用場景,靈活運用不同的傳播行為,以達到最佳的事務管理效果。

責任編輯:趙寧寧 來源: 猿java
相關推薦

2023-10-30 07:36:19

Spring事務傳播機制

2022-08-27 14:14:06

Spring事務開發

2020-07-17 08:07:54

Spring數據庫事務

2021-06-26 14:59:13

SpringTransaction執行

2024-01-04 12:48:00

Spring

2010-07-13 15:14:15

2021-07-12 10:37:42

Spring面試事務

2023-04-27 07:34:36

前端工程師前端已死

2012-06-07 09:18:16

ibmdw

2020-08-19 09:45:29

Spring數據庫代碼

2022-06-28 14:57:09

FormatterSpring

2019-08-15 16:30:49

TomcatSpringBootJava

2022-09-27 21:14:54

Spring事務傳播機制

2011-03-25 10:00:23

Spring3.0事務的配置

2019-12-09 15:08:30

JavaTomcatWeb

2023-05-06 07:29:49

Spring事務傳播

2021-09-07 10:33:42

MySQL事務隔離性

2021-07-20 15:42:05

編程語言PythonJava

2024-12-30 13:58:14

2024-01-08 08:45:07

Spring容器Bean
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩欧美在线免费观看视频 | 男女网站视频 | 国产日韩欧美激情 | 狠狠色香婷婷久久亚洲精品 | 日韩快播电影网 | 午夜精品影院 | 亚洲二区在线 | 亚洲国产精品一区二区第一页 | 一区二区三区视频在线免费观看 | 国产91黄色 | 成年精品 | 在线视频国产一区 | 精品国产黄a∨片高清在线 成人区精品一区二区婷婷 日本一区二区视频 | 久久精彩 | 色婷综合网 | 国产高清视频一区二区 | 国产精品一区一区三区 | 91精品在线播放 | 国产日韩一区二区三区 | av网址在线播放 | 欧美伊人| 嫩草最新网址 | 成人精品鲁一区一区二区 | 在线免费观看黄色 | 激情av免费看| 国产欧美日韩久久久 | 国产精品一区二区视频 | 一区二区免费 | 日韩三片 | 亚洲成人av | 中文字幕av在线 | 日韩影院在线观看 | 国产亚洲欧美日韩精品一区二区三区 | 中国三级黄色录像 | 久久久久久综合 | 综合久久亚洲 | 亚洲久草视频 | 国产乱码一二三区精品 | 国产小网站 | 91精品国产自产精品男人的天堂 | 欧美国产精品久久久 |