Spring Boot事務失效場景及解決方案

事務失效場景1:方法非public修飾

原因
Spring事務基于動態代理(AOP)實現,非public方法無法被代理攔截,導致事務失效。

代碼示例

@Service
public class OrderService {@Transactionalprivate void createOrder() { // 非public方法// 業務邏輯}
}

解決方案

  • 將方法改為public修飾。
  • 若需限制方法訪問權限,可通過編程式事務(TransactionTemplate)實現。

事務失效場景2:自調用問題

原因
同類中方法A調用方法B(帶@Transactional),由于代理機制失效,事務不生效。

代碼示例

@Service
public class UserService {public void updateUser() {this.saveUser(); // 自調用}@Transactionalpublic void saveUser() {// 數據庫操作}
}

解決方案

  • 將事務方法拆分到另一個類中,通過注入調用。
  • 使用AopContext.currentProxy()獲取代理對象(需開啟exposeProxy)。

事務失效場景3:異常類型未被捕獲

原因
默認僅對RuntimeExceptionError回滾,若拋出其他異常(如IOException)且未配置rollbackFor,事務不會回滾。

代碼示例

@Transactional
public void processData() throws IOException {// 拋出IOExceptionthrow new IOException("文件異常");
}

解決方案

  • 明確指定回滾異常類型:
    @Transactional(rollbackFor = Exception.class)
    

事務失效場景4:事務傳播行為配置錯誤

原因
例如REQUIRES_NEW嵌套使用時,內層事務失敗可能不影響外層事務。

代碼示例

@Transactional(propagation = Propagation.REQUIRED)
public void outerMethod() {innerMethod(); // 內層事務獨立提交
}@Transactional(propagation = Propagation.REQUIRES_NEW)
public void innerMethod() {// 操作失敗但outerMethod繼續執行
}

解決方案

  • 根據業務需求調整傳播行為,如改為REQUIRED
  • 避免過度嵌套事務。

事務失效場景5:多數據源未指定事務管理器

原因
多數據源環境下未明確指定transactionManager,導致事務綁定到默認管理器。

代碼示例

@Transactional // 默認使用primary事務管理器
public void saveToSecondaryDB() {// 操作secondary數據源
}

解決方案

  • 注解中指定事務管理器:
    @Transactional("secondaryTransactionManager")
    

事務失效場景6:手動捕獲異常未拋出

原因
捕獲異常后未重新拋出,事務攔截器無法觸發回滾。

代碼示例

@Transactional
public void updateOrder() {try {// 數據庫操作} catch (Exception e) {log.error("錯誤", e); // 未拋出異常}
}

解決方案

  • catch塊中拋出RuntimeException
  • 或使用TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()手動回滾。

事務失效場景7:非事務方法調用事務方法

原因
若父類方法未開啟事務,調用子類@Transactional方法時,代理失效。

代碼示例

public class BaseService {public void execute() {save(); // 事務失效}@Transactionalpublic void save() {}
}

解決方案

  • 將事務注解添加到父類方法。
  • 避免通過繼承層級調用事務方法。

總結
  • 檢查方法修飾符和代理機制。
  • 確保異常類型和傳播行為匹配業務需求。
  • 多數據源需顯式指定事務管理器。
  • 優先通過設計規避自調用問題。

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

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

相關文章

電子電路:怎么理解時鐘脈沖上升沿這句話?

時鐘脈沖是數字電路中用于同步各組件操作的周期性信號,通常表現為高低電平交替的方波。理解其關鍵點如下: 時鐘脈沖的本質: 由晶振等元件生成,呈現0/1(低/高電平)的規律振蕩每個周期包含上升沿→高電平→下…

docker部署redis mysql nacos seata rabbitmq minio onlyoffice nginx實戰

docker部署redis mysql nacos seata rabbitmq minio onlyoffice nginx實戰 一、環境介紹 操作系統:ubuntu22.04 軟件環境:docker、docker-compose 二、docker安裝 版本規定到26.1.3版本過低會引起莫名其妙的問題。打開終端。更新軟件包列表&#x…

全面解析:npm 命令、package.json 結構與 Vite 詳解

全面解析:npm 命令、package.json 結構與 Vite 詳解 一、npm run dev 和 npm run build 命令解析 1. npm run dev 作用:啟動開發服務器,用于本地開發原理: 啟動 Vite 開發服務器提供實時熱更新(HMR)功能…

【Oracle】TCL語言

個人主頁:Guiat 歸屬專欄:Oracle 文章目錄 1. TCL概述1.1 什么是TCL?1.2 TCL的核心功能 2. 事務基礎概念2.1 事務的ACID特性2.2 事務的生命周期 3. COMMIT語句詳解3.1 COMMIT基礎語法3.2 自動提交與手動提交3.3 提交性能優化 4. ROLLBACK語句…

OpenCV CUDA模塊直方圖計算------用于在 GPU 上執行對比度受限的自適應直方圖均衡類cv::cuda::CLAHE

操作系統:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 編程語言:C11 算法描述 cv::cuda::CLAHE 是 OpenCV 的 CUDA 模塊中提供的一個類,用于在 GPU 上執行對比度受限的自適應直方圖均衡(Contrast Limi…

OpenGAN:基于開放數據生成的開放集識別

簡介 簡介:這次學習的OpenGAN主要學習一個思路,跳出傳統GAN對于判斷真假的識別到判斷是已知種類還是未知種類。重點內容不在于代碼而是思路,會簡要給出一個設計的代碼。 論文題目:OpenGAN: Open-Set Recognition via Open Data …

隨機游動算法解決kSAT問題

input:n個變量的k-CNF公式 ouput:該公式的一組滿足賦值或宣布沒有滿足賦值 算法步驟: 隨機均勻地初始化賦值 a ∈ { 0 , 1 } n a\in\{0,1\}^n a∈{0,1}n.重復t次(后面會估計這個t): a. 如果在當前賦值下…

企業上線ESOP電子作業指導書系統實現車間無紙化的投入收益數據綜合分析

企業上線ESOP電子作業指導書系統實現車間無紙化的投入收益數據綜合分析 一、成本節約:無紙化直接降低運營成本 紙張與耗材費用銳減 o 杭州科創致遠案例:某汽配企業引入無紙化系統后,年節省紙張耗材費用超50萬元。通過電子化替代傳統紙質文檔…

高并發抽獎系統優化方案

引子 最近接觸了一個抽獎的項目,由于用戶量比較大,而且第三方提供的認證接口并發量有限,為了保證服務的高可用性,所以對高并限制發有一定的要求。經過一系列研究和討論,做出了以下一些優化方案。 需求分析 根據用戶量…

STM32八股【10】-----stm32啟動流程

啟動流程 1.上電復位 2.系統初始化 3.跳轉到 main 函數 啟動入口: cpu被清空,程序從0x00000000開始運行0x00000000存放的是reset_handler的入口地址0x00000000的實際位置會變,根據不同的啟動模式決定啟動模式分為: flash啟動&a…

LLMTIME: 不用微調!如何用大模型玩轉時間序列預測?

今天是端午節,端午安康!值此傳統佳節之際,我想和大家分享一篇關于基于大語言模型的時序預測算法——LLMTIME。隨著人工智能技術的飛速發展,利用大型預訓練語言模型(LLM)進行時間序列預測成為一個新興且極具…

在VirtualBox中打造高效開發環境:CentOS虛擬機安裝與優化指南

🔥「炎碼工坊」技術彈藥已裝填! 點擊關注 → 解鎖工業級干貨【工具實測|項目避坑|源碼燃燒指南】 一、為何選擇VirtualBox CentOS組合? 對于程序員而言,構建隔離的開發測試環境是剛需。VirtualBox憑借其跨平臺支持(W…

LeeCode 98. 驗證二叉搜索樹

給你一個二叉樹的根節點 root ,判斷其是否是一個有效的二叉搜索樹。 有效 二叉搜索樹定義如下: 節點的左子樹只包含 小于 當前節點的數。節點的右子樹只包含 大于 當前節點的數。所有左子樹和右子樹自身必須也是二叉搜索樹。 提示: 樹中節…

Python簡易音樂播放器開發教程

📚 前言 編程基礎第一期《12-30》–音樂播放器是日常生活中常用的應用程序,使用Python和pygame庫可以輕松實現一個簡易的音樂播放器。本教程將詳細講解如何開發一個具有基本功能的音樂播放器,并解析其中涉及的Python編程知識點。 &#x1f6e…

ssh連接斷開,保持任務后臺執行——tmux

目錄 **核心用途****基礎使用方法**1. **安裝 tmux**2. **啟動新會話**3. **常用快捷鍵(需先按 Ctrlb 前綴)**4. **會話管理命令**5. **窗格操作進階** **典型工作流****注意事項****配置文件(~/.tmux.conf)** tmux( …

3D Gaussian splatting 04: 代碼閱讀-提取相機位姿和稀疏點云

目錄 3D Gaussian splatting 01: 環境搭建3D Gaussian splatting 02: 快速評估3D Gaussian splatting 03: 用戶數據訓練和結果查看3D Gaussian splatting 04: 代碼閱讀-提取相機位姿和稀疏點云3D Gaussian splatting 05: 代碼閱讀-訓練整體流程3D Gaussian splatting 06: 代碼…

每日c/c++題 備戰藍橋杯(P1204 [USACO1.2] 擠牛奶 Milking Cows)

P1204 [USACO1.2] 擠牛奶 Milking Cows - 詳解與代碼實現 一、題目背景 三個農民每天清晨[……](簡要介紹題目背景,與官網描述類似) 二、問題分析 輸入要求 :讀取 N 個農民的擠奶時間區間,計算兩個值:最…

保持本地 Git 項目副本與遠程倉庫完全同步

核心目標: 保持本地 Git 項目副本與 GitHub 遠程倉庫完全同步。 關鍵方法: 定期執行 git pull 命令。 操作步驟: 進入項目目錄: 在終端/命令行中,使用 cd 命令切換到你的項目文件夾。執行拉取命令: 運行…

Flutter 4.x 版本 webview_flutter 嵌套H5

踩坑早期版本 使用 WebView 代碼如下 import package:flutter/material.dart; import package:webview_flutter/webview_flutter.dart;class HomePage extends StatelessWidget {const HomePage({super.key});overrideWidget build(BuildContext context) {return Scaffold(ap…

rtpinsertsound:語音注入攻擊!全參數詳細教程!Kali Linux教程!

簡介 2006年8月至9月期間,我們創建了一個用于將音頻插入指定音頻(即RTP)流的工具。該工具名為rtpinsertsound。 該工具已在Linux Red Hat Fedora Core 4平臺(奔騰IV,2.5 GHz)上進行了測試,但預…