Spring是如何傳播事務的?什么是事務傳播行為

Spring是如何傳播事務的?

Spring框架通過聲明式事務管理來傳播事務,主要依賴于AOP(面向切面編程)和事務攔截器來實現。Spring的事務傳播機制是基于Java Transaction API (JTA) 或者本地資源管理器(如Hibernate、JDBC等)來完成的。以下是Spring如何實現事務傳播的基本過程:

1. 配置事務管理器

首先,你需要配置一個合適的事務管理器,這取決于你使用的數據訪問技術。例如,如果你使用的是JDBC或MyBatis,你可以選擇DataSourceTransactionManager;如果使用的是Hibernate,則可以使用HibernateTransactionManager;對于分布式事務,可以使用JtaTransactionManager

2. 使用@Transactional注解

在需要事務管理的方法或類上添加@Transactional注解,并設置相應的傳播行為屬性(propagation)。這是最常用的聲明式事務管理方式。例如:

@Transactional(propagation = Propagation.REQUIRED)
public void performService() {// 業務邏輯代碼
}

3. AOP自動代理

當你配置了事務管理器并使用了@Transactional注解后,Spring會自動創建代理對象。當調用被@Transactional標注的方法時,實際上是通過這個代理對象進行調用。代理對象會在方法執行前后進行事務的開啟、提交或回滾操作。

4. 事務傳播行為的應用

根據不同的傳播行為設置,Spring會決定當前方法是否應該在已有事務中運行,還是應該啟動新事務,或者以其他方式處理事務。比如,Propagation.REQUIRED表示如果當前存在事務,則加入該事務;如果沒有事務,則創建一個新事務。

5. 異常處理

默認情況下,Spring會在遇到運行時異常或錯誤時回滾事務。不過,你可以通過@Transactional注解的rollbackFor和noRollbackFor屬性來自定義哪些異常發生時應回滾事務,哪些不應回滾。

通過這種方式,Spring能夠靈活地管理和傳播事務,確保業務邏輯的一致性和完整性。同時,它也提供了足夠的靈活性,讓開發者可以根據實際需求定制事務的行為。

Spring事務傳播行為

Spring事務傳播行為定義了在存在或不存在當前事務時,如何處理新方法的事務。以下是各個傳播行為的具體說明及其典型應用場景:

  1. REQUIRED(默認值)

    • 描述: 如果當前存在事務,則加入該事務;如果不存在事務,則創建一個新事務。
    • 應用場景: 大多數情況下,這是最常用的設置。例如,在服務層中執行數據庫操作,通常希望這些操作在同一事務中進行,以確保數據一致性。
  2. SUPPORTS

    • 描述: 如果當前存在事務,則加入該事務;如果不存在事務,則以非事務方式繼續運行。
    • 應用場景: 適用于那些不需要事務性保障的操作,但如果被其他需要事務的操作調用時,可以共享外部事務。比如讀取一些不敏感的數據信息。
  3. MANDATORY

    • 描述: 如果當前存在事務,則加入該事務;如果不存在事務,則拋出異常。
    • 應用場景: 當你確定某些業務邏輯必須在事務內執行時使用。這可以作為一種安全措施,確保不會意外地以非事務方式調用關鍵操作。
  4. REQUIRES_NEW

    • 描述: 創建一個新的事務,如果當前存在事務,則暫停當前事務。
    • 應用場景: 需要確保某個操作獨立于其他事務,即使外圍事務回滾也不受影響。例如,記錄審計日志或發送通知消息,這些操作應獨立于業務邏輯事務。
  5. NOT_SUPPORTED

    • 描述: 以非事務方式執行操作,如果當前存在事務,則暫停當前事務。
    • 應用場景: 對于性能要求較高且不需要事務保證的操作,如查詢操作,避免不必要的事務開銷。
  6. NEVER

    • 描述: 以非事務方式執行,如果當前存在事務,則拋出異常。
    • 應用場景: 確保某些方法絕對不會在事務上下文中被調用,適合那些明確不應該與事務關聯的操作。
  7. NESTED

    • 描述: 如果當前存在事務,則在嵌套事務內執行。如果當前不存在事務,則其行為類似于REQUIRED
    • 應用場景: 當你需要支持部分回滾時使用。例如,如果你在一個大事務中有多個步驟,并且希望在某一步驟失敗時僅回滾該步驟而不是整個事務。

下面是一個簡單的示例展示如何使用這些傳播行為:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;@Service
public class TransactionalService {@Autowiredprivate AnotherTransactionalService anotherService;@Transactional(propagation = Propagation.REQUIRED)public void required() {// 業務邏輯anotherService.anotherMethod();}@Transactional(propagation = Propagation.REQUIRES_NEW)public void requiresNew() throws Exception {// 業務邏輯anotherService.anotherMethod();}// 其他傳播行為的示例略...
}

在這個例子中,required()方法使用了Propagation.REQUIRED傳播行為,意味著如果當前有事務,它會加入這個事務;如果沒有,就會創建一個新事務。而requiresNew()方法使用了Propagation.REQUIRES_NEW,這會保證每次調用時都會有一個獨立的新事務開始,即使在外圍已經有事務存在。注意,具體到每個傳播行為的實現細節都依賴于Spring框架底層的事務管理機制以及所使用的事務管理器(如JpaTransactionManager、DataSourceTransactionManager等)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/78751.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/78751.shtml
英文地址,請注明出處:http://en.pswp.cn/web/78751.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python-pandas-操作Excel文件(讀取數據/寫入數據)及Excel表格列名操作詳細分享

Python-pandas-操作Excel文件(讀取數據/寫入數據) 提示:幫幫志會陸續更新非常多的IT技術知識,希望分享的內容對您有用。本章分享的是pandas的使用語法。前后每一小節的內容是存在的有:學習and理解的關聯性。【幫幫志系列文章】:每…

PHP分頁顯示數據,在phpMyadmin中添加數據

<?php $conmysqli_connect(localhost,root,,stu); mysqli_query($con,"set names utf8"); //設置字符集為utf8 $sql"select * from teacher"; $resultmysqli_query($con,$sql); $countmysqli_num_rows($result); //記錄總條數$count。 $pagesize10;//每…

智能參謀部系統架構和業務場景功能實現

將以一個基于微服務和云原生理念、深度集成人工智能組件、強調實時性與韌性的系統架構為基礎,詳細闡述如何落地“智能參謀部”的各項能力。這不是一個簡單的軟件堆疊,而是一個有機整合了數據、知識、模型、流程與人員的復雜體系。 系統愿景:“智能參謀部”——基于AI賦能的…

企業級RAG架構設計:從FAISS索引到HyDE優化的全鏈路拆解,金融/醫療領域RAG落地案例與避坑指南(附架構圖)

本文較長&#xff0c;純干貨&#xff0c;建議點贊收藏&#xff0c;以免遺失。更多AI大模型應用開發學習內容&#xff0c;盡在聚客AI學院。 一. RAG技術概述 1.1 什么是RAG&#xff1f; RAG&#xff08;Retrieval-Augmented Generation&#xff0c;檢索增強生成&#xff09; 是…

Spring Boot Validation實戰詳解:從入門到自定義規則

目錄 一、Spring Boot Validation簡介 1.1 什么是spring-boot-starter-validation&#xff1f; 1.2 核心優勢 二、快速集成與配置 2.1 添加依賴 2.2 基礎配置 三、核心注解詳解 3.1 常用校驗注解 3.2 嵌套對象校驗 四、實戰開發步驟 4.1 DTO類定義校驗規則 4.2 Cont…

理清緩存穿透、緩存擊穿、緩存雪崩、緩存不一致的本質與解決方案

在構建高性能系統中&#xff0c;緩存&#xff08;如Redis&#xff09; 是不可或缺的關鍵組件&#xff0c;它大幅減輕了數據庫壓力、加快了響應速度。然而&#xff0c;在高并發環境下&#xff0c;緩存也可能帶來一系列棘手的問題&#xff0c;如&#xff1a;緩存穿透、緩存擊穿、…

PyTorch_構建線性回歸

使用 PyTorch 的 API 來手動構建一個線性回歸的假設函數&#xff0c;數據加載器&#xff0c;損失函數&#xff0c;優化方法&#xff0c;繪制訓練過程中的損失變化。 數據構建 import torch from sklearn.datasets import make_regression import matplotlib.pyplot as plt i…

005-nlohmann/json 基礎方法-C++開源庫108杰

《二、基礎方法》&#xff1a;節點訪問、值獲取、顯式 vs 隱式、異常處理、迭代器、類型檢測、異常處理……一節課搞定C處理JSON數據85%的需求…… JSON 字段的簡單類型包括&#xff1a;number、boolean、string 和 null&#xff08;即空值&#xff09;&#xff1b;復雜類型則有…

HarmonyOS 5.0 分布式數據協同與跨設備同步??

大家好&#xff0c;我是 V 哥。 使用 Mate 70有一段時間了&#xff0c;系統的絲滑使用起來那是爽得不要不要的&#xff0c;隨著越來越多的應用適配&#xff0c;目前使用起來已經和4.3的兼容版本功能差異無礙了&#xff0c;還有些純血鴻蒙獨特的能力很是好用&#xff0c;比如&am…

Linux云計算訓練營筆記day02(Linux、計算機網絡、進制)

Linux 是一個操作系統 Linux版本 RedHat Rocky Linux CentOS7 Linux Ubuntu Linux Debian Linux Deepin Linux 登錄用戶 管理員 root a 普通用戶 nsd a 打開終端 放大: ctrl shift 縮小: ctrl - 命令行提示符 [rootlocalhost ~]# ~ 家目錄 /root 當前登錄的用戶…

macOS 安裝了Docker Desktop版終端docker 命令沒辦法使用

macOS 安裝了Docker Desktop版終端docker 命令沒辦法使用 1、檢查Docker Desktop能否正常運行。 確保Docker Desktop能正常運行。 2、檢查環境變量是否添加 1、添加環境變量 如果環境變量中沒有包含Docker的路徑&#xff0c;你可以手動添加。首先&#xff0c;找到Docker的…

Gradio全解20——Streaming:流式傳輸的多媒體應用(5)——基于WebRTC的攝像頭實時目標檢測

Gradio全解20——Streaming&#xff1a;流式傳輸的多媒體應用&#xff08;5&#xff09;——基于WebRTC的攝像頭實時目標檢測 本篇摘要20. Streaming&#xff1a;流式傳輸的多媒體應用20.5 基于WebRTC的攝像頭實時目標檢測20.5.1 環境配置及說明1. WebRTC2. TURN服務器 20.5.2 …

OSCP - Proving Grounds - NoName

主要知識點 linux命令注入SUID find提權 具體步驟 從nmap開始搜集信息&#xff0c;只開放了一個80端口 Nmap scan report for 192.168.171.15 Host is up (0.40s latency). Not shown: 65534 closed tcp ports (reset) PORT STATE SERVICE VERSION 80/tcp open http …

c++_csp-j算法 (6)_高精度算法(加減乘除)

高精度算法 C++高精度算法是指在C++編程語言中實現高精度計算的算法。在C++中,通常整數的范圍是有限的,超出這個范圍的整數計算會導致溢出。高精度算法的出現,使得C++程序能夠處理超出常規整數范圍的大整數計算,包括高精度加法、減法、乘法、除法等運算。 在C++中實現高精…

從OpenMP中的不兼容,窺探AI應用開發中的并行編程

在AI相關的項目開發中,偶然遇到下面這個問題: OMP: Error #15: Initializing libomp.dylib, but found libiomp5.dylib already initialized. OMP: Hint This means that multiple copies of the OpenMP runtime have been linked into the progr am. That is dangerous, sin…

vue2+element實現Table表格嵌套輸入框、選擇器、日期選擇器、表單彈出窗組件的行內編輯功能

vue2element實現Table表格嵌套輸入框、選擇器、日期選擇器、表單彈出窗組件的行內編輯功能 文章目錄 vue2element實現Table表格嵌套輸入框、選擇器、日期選擇器、表單彈出窗組件的行內編輯功能前言一、準備工作二、行內編輯1.嵌入Input文本輸入框1.1遇到問題1.文本框內容修改失…

c#OdbcDataReader的數據讀取

先有如下c#示例代碼&#xff1a; string strconnect "DSNcustom;UIDsa;PWD123456;" OdbcConnection odbc new OdbcConnection(strconnect); odbc.Open(); if (odbc.State ! System.Data.ConnectionState.Open) { return; } string strSql "select ID from my…

【HTML5】老式放映機原理-實現圖片無縫滾動

老式放映機原理-實現圖片無縫滾動 實現思路&#xff1a; 頁面設計部分——先將視口div設置為相對定位&#xff0c;再視口div里面嵌套一個類似“膠卷”的div,把該div設置為絕對定位&#xff0c;此時“膠卷"會掛靠在視口上面&#xff0c;再將“膠卷”的left屬性設置為負值…

LeetCode 1781. 所有子字符串美麗值之和 題解

示例 輸入&#xff1a;s "aabcb" 輸出&#xff1a;5 解釋&#xff1a;美麗值不為零的字符串包括 ["aab","aabc","aabcb","abcb","bcb"] &#xff0c;每一個字符串的美麗值都為 1這題光用文字解說還是無法達到講…

2025ACTF Web部分題解

文章目錄 ACTF uploadnot so web 1not so web 2 ACTF upload 前面登錄隨便輸入可以進入文件上傳頁面, 隨便上傳一張圖片, 發現路由存在file_path參數, 嘗試路徑穿越讀取文件 發現可以成功讀取 讀取源碼 /upload?file_path../app.pyimport uuid import os import hashlib im…