偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

不同的事務(wù),在 Spring 中是如何傳播的?

開發(fā)
本文我們?cè)敿?xì)分析了 Spring 事務(wù)傳播行為,掌握它們對(duì)于構(gòu)建健壯的事務(wù)管理策略至關(guān)重要。

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

一、事務(wù)傳播行為概述

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

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

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

二、原理分析

事務(wù)傳播行為主要決定了在一個(gè)事務(wù)方法被調(diào)用時(shí),當(dāng)前存在的事務(wù)(如果有)應(yīng)該如何被處理。以下是其原理分析:

  • 事務(wù)的存在檢查:當(dāng)一個(gè)方法(被調(diào)用者)執(zhí)行時(shí),它會(huì)檢查調(diào)用它的方法(調(diào)用者)是否存在活動(dòng)事務(wù)。
  • 決定是否掛起、重用或創(chuàng)建新事務(wù):根據(jù)傳播行為的不同,調(diào)用者可能會(huì)被掛起,或者調(diào)用者的方法可能會(huì)加入到現(xiàn)有事務(wù)中,或者開啟一個(gè)全新的事務(wù)。
  • 事務(wù)的邊界控制:傳播行為還控制了事務(wù)的提交和回滾邊界,確保在復(fù)雜調(diào)用鏈中事務(wù)的一致性與完整性。

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

1. REQUIRED

定義:支持當(dāng)前事務(wù)。如果沒有事務(wù),就新建一個(gè)事務(wù)。

原理:調(diào)用者存在事務(wù),方法加入到這個(gè)事務(wù)中;否則,開啟新事務(wù)。

示例:

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

@Transactional(propagation = Propagation.REQUIRED)
public void methodB() {
    // 執(zhí)行數(shù)據(jù)庫(kù)操作
}

分析:methodA 開啟事務(wù),methodB 加入到同一個(gè)事務(wù)中。如果 methodA 回滾,methodB 也會(huì)回滾。

2. REQUIRES_NEW

定義:新建事務(wù),如果存在事務(wù),就將當(dāng)前事務(wù)掛起。

原理:無論調(diào)用者是否存在事務(wù),方法都會(huì)開啟一個(gè)獨(dú)立的新事務(wù)。

示例:

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

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodB() {
    // 執(zhí)行數(shù)據(jù)庫(kù)操作
}

分析:methodA 和 methodB 各自有獨(dú)立的事務(wù)。如果 methodB 回滾,不會(huì)影響 methodA 的事務(wù)。

3. SUPPORTS

定義:支持當(dāng)前事務(wù),如果存在事務(wù),就加入;否則,以非事務(wù)方式執(zhí)行。

原理:依賴調(diào)用者是否有事務(wù),調(diào)用者有則參與事務(wù),無則不使用事務(wù)。

示例:

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

@Transactional(propagation = Propagation.SUPPORTS)
public void methodB() {
    // 執(zhí)行數(shù)據(jù)庫(kù)操作
}

分析:如果 methodA 調(diào)用 methodB,methodB 會(huì)參與 methodA 的事務(wù)。如果 methodB 被獨(dú)立調(diào)用,則以非事務(wù)方式執(zhí)行。

4. NOT_SUPPORTED

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

原理:方法不支持事務(wù),即使調(diào)用者有事務(wù),也不會(huì)參與。

示例:

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

@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void methodB() {
    // 執(zhí)行數(shù)據(jù)庫(kù)操作
}

分析:methodA 的事務(wù)會(huì)在執(zhí)行 methodB 時(shí)被掛起,methodB 以非事務(wù)方式執(zhí)行,執(zhí)行完畢后恢復(fù) methodA 的事務(wù)。

5. MANDATORY

定義:支持當(dāng)前事務(wù),必須存在一個(gè)事務(wù),否則拋出異常。

原理:如果調(diào)用者有事務(wù),方法參與;否則,拋出 IllegalTransactionStateException。

示例:

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

@Transactional(propagation = Propagation.MANDATORY)
public void methodB() {
    // 執(zhí)行數(shù)據(jù)庫(kù)操作
}

分析:當(dāng) methodA 調(diào)用 methodB 時(shí),由于 methodA 有事務(wù),methodB 可以正常參與事務(wù)。如果 methodB 被獨(dú)立調(diào)用,無事務(wù),會(huì)拋出異常。

6. NEVER

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

原理:方法絕不支持事務(wù),確保其執(zhí)行不在事務(wù)上下文中。

示例:

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

@Transactional(propagation = Propagation.NEVER)
public void methodB() {
    // 執(zhí)行數(shù)據(jù)庫(kù)操作
}

分析:當(dāng) methodA 調(diào)用 methodB 時(shí),由于 methodA 有事務(wù),調(diào)用 methodB 會(huì)拋出異常。如果 methodB 被獨(dú)立調(diào)用,無事務(wù),則正常執(zhí)行。

7. NESTED

定義:如果存在事務(wù),則在嵌套事務(wù)內(nèi)執(zhí)行;否則,類似于 REQUIRED。

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

示例:

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
    // 執(zhí)行數(shù)據(jù)庫(kù)操作
    methodB();
    // 繼續(xù)執(zhí)行
}

@Transactional(propagation = Propagation.NESTED)
public void methodB() {
    // 執(zhí)行數(shù)據(jù)庫(kù)操作
}

分析:如果 methodB 出現(xiàn)異常且事務(wù)被回滾,只會(huì)回滾到 methodB 的開始,而 methodA 的事務(wù)仍然可以繼續(xù)或回滾。

四、傳播行為對(duì)比

傳播行為

是否必須存在事務(wù)

是否開啟新事務(wù)

是否掛起現(xiàn)有事務(wù)

適用場(chǎng)景

REQUIRED




默認(rèn)行為,絕大多數(shù)場(chǎng)景使用,如服務(wù)層方法。

REQUIRES_NEW




需要獨(dú)立事務(wù),如日志記錄,不受外部事務(wù)影響。

SUPPORTS




可選事務(wù)性,讀操作等,既能在事務(wù)中也能在非事務(wù)中運(yùn)行。

NOT_SUPPORTED




非事務(wù)操作,如與事務(wù)無關(guān)的外部系統(tǒng)交互。

MANDATORY




強(qiáng)制要求存在事務(wù)的操作,確保方法調(diào)用在事務(wù)環(huán)境中。

NEVER




確保方法在非事務(wù)環(huán)境中執(zhí)行,避免事務(wù)上下文。

NESTED


基于底層支持


需要在事務(wù)內(nèi)進(jìn)行部分回滾的場(chǎng)景,如復(fù)雜業(yè)務(wù)操作。

關(guān)鍵差異點(diǎn):

  • 是否開啟新事務(wù):REQUIRES_NEW 和 NESTED 可以開啟新事務(wù),其他大部分屬于參與現(xiàn)有事務(wù)或非事務(wù)。
  • 是否必須存在事務(wù):MANDATORY 和 NEVER 針對(duì)事務(wù)的存在有嚴(yán)格要求。
  • 是否掛起現(xiàn)有事務(wù):REQUIRES_NEW 和 NOT_SUPPORTED 會(huì)掛起當(dāng)前事務(wù)。
  • 嵌套事務(wù)支持:NESTED 依賴于底層數(shù)據(jù)庫(kù)的 savepoint 支持,允許在同一事務(wù)中進(jìn)行局部回滾。

五、實(shí)際應(yīng)用中的選擇

  • 大多數(shù)場(chǎng)景:使用 REQUIRED 是最合適的選擇,因?yàn)樗?jiǎn)化了事務(wù)管理,并且大多數(shù)情況下方法需要參與到調(diào)用者的事務(wù)中。
  • 獨(dú)立事務(wù)需求:如日志記錄、發(fā)送通知等,需要與主事務(wù)獨(dú)立的操作,可以使用 REQUIRES_NEW。
  • 可選事務(wù):對(duì)于既能在事務(wù)中運(yùn)行也能在非事務(wù)中運(yùn)行的操作,可以使用 SUPPORTS。
  • 確保非事務(wù)執(zhí)行:若某操作必須在非事務(wù)環(huán)境下執(zhí)行,如一些特定的外部系統(tǒng)調(diào)用,可以使用 NOT_SUPPORTED 或 NEVER。
  • 強(qiáng)制要求事務(wù):在某些關(guān)鍵業(yè)務(wù)邏輯中,確保方法只能在事務(wù)中調(diào)用,可以使用 MANDATORY。
  • 局部回滾需求:在復(fù)雜業(yè)務(wù)場(chǎng)景下,需要對(duì)某部分操作進(jìn)行局部回滾,可以考慮使用 NESTED,但需確保底層數(shù)據(jù)庫(kù)支持。

六、注意事項(xiàng)

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

七、總結(jié)

本文,我們?cè)敿?xì)分析了 Spring 事務(wù)傳播行為,掌握它們對(duì)于構(gòu)建健壯的事務(wù)管理策略至關(guān)重要。通過合理選擇合適的傳播行為,可以確保在復(fù)雜的業(yè)務(wù)邏輯和調(diào)用鏈中,數(shù)據(jù)的一致性和系統(tǒng)的穩(wěn)定性。開發(fā)人員應(yīng)根據(jù)具體的業(yè)務(wù)需求和應(yīng)用場(chǎng)景,靈活運(yùn)用不同的傳播行為,以達(dá)到最佳的事務(wù)管理效果。

責(zé)任編輯:趙寧寧 來源: 猿java
相關(guān)推薦

2023-10-30 07:36:19

Spring事務(wù)傳播機(jī)制

2022-08-27 14:14:06

Spring事務(wù)開發(fā)

2020-07-17 08:07:54

Spring數(shù)據(jù)庫(kù)事務(wù)

2021-06-26 14:59:13

SpringTransaction執(zhí)行

2024-01-04 12:48:00

Spring

2010-07-13 15:14:15

2021-07-12 10:37:42

Spring面試事務(wù)

2023-04-27 07:34:36

前端工程師前端已死

2012-06-07 09:18:16

ibmdw

2020-08-19 09:45:29

Spring數(shù)據(jù)庫(kù)代碼

2022-06-28 14:57:09

FormatterSpring

2019-08-15 16:30:49

TomcatSpringBootJava

2022-09-27 21:14:54

Spring事務(wù)傳播機(jī)制

2011-03-25 10:00:23

Spring3.0事務(wù)的配置

2019-12-09 15:08:30

JavaTomcatWeb

2023-05-06 07:29:49

Spring事務(wù)傳播

2021-09-07 10:33:42

MySQL事務(wù)隔離性

2021-07-20 15:42:05

編程語言PythonJava

2024-12-30 13:58:14

2024-01-08 08:45:07

Spring容器Bean
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)