@Transactional 注解失效的場景及原因分析

先分析一下

1,內部調用,@原對象調用,不是代理對象調用

2,private方法,@源碼中,只能是public方法

3,異常被捕獲了,@事物攔截器,無法感知

4,子線程調用,@事物TreadLocal實現,主子線程獨立

5,Roback 設置不對,@默認對RuntimeExcpetion+error有效,sql,io無效,@Exception

6,傳播機制不對,@被調用方法B是new,A調用B,A異常,B不會滾,他是新的事物

7,存儲引擎不是innodb

8,事物未開啟

DS

@Transactional?注解失效的場景及原因分析

@Transactional?是 Spring 聲明式事務的核心注解,但在某些場景下會失效。以下是常見的失效場景及其根本原因:


1. 自調用(同一個類中方法調用)

場景

java

復制

下載

public class OrderService {public void createOrder() {this.updateStatus(); // 自調用,事務失效}@Transactionalpublic void updateStatus() {// 業務邏輯}
}

原因

  • Spring 事務基于 AOP 代理實現,自調用時通過?this?調用的原始對象而非代理對象,導致攔截器無法介入。

解決方案

  • 注入自身代理:@Autowired private OrderService self;?然后調用?self.updateStatus()

  • 將方法拆分到不同類中


2. 方法訪問權限非 public

場景

java

復制

下載

@Transactional
private void updateData() { // 事務失效// ...
}

原因

  • Spring 默認只代理 public 方法(CGLIB 可代理 protected,但官方不建議)。

  • 動態代理(JDK/CGLIB)無法攔截 private 方法。

解決方案

  • 將方法改為?public

  • 改用編程式事務(TransactionTemplate


3. 異常類型不匹配

場景

java

復制

下載

@Transactional
public void process() throws Exception {try {// 可能拋出IOException} catch (IOException e) {throw new Exception("業務異常"); // 非RuntimeException}
}

原因

  • 默認只對?RuntimeException?和?Error?回滾,受檢異常(如?Exception)不會觸發回滾。

解決方案

  • 明確指定回滾異常:

    java

    復制

    下載

    @Transactional(rollbackFor = Exception.class)
  • 拋出?RuntimeException?或其子類


4. 數據庫引擎不支持事務

場景

  • 使用 MyISAM 引擎的 MySQL 表

  • 某些 NoSQL 數據庫(如 MongoDB 舊版本)

原因

  • MyISAM 不支持事務,僅 InnoDB 支持。

  • 部分數據庫無事務能力。

解決方案

  • 切換為 InnoDB 引擎:

    sql

    復制

    下載

    ALTER TABLE your_table ENGINE=InnoDB;

5. 多線程調用

場景

java

復制

下載

@Transactional
public void asyncTask() {new Thread(() -> {// 子線程中的操作不受事務控制}).start();
}

原因

  • 事務信息通過?ThreadLocal?存儲,子線程無法繼承父線程的事務上下文。

解決方案

  • 使用?TransactionTemplate?編程式事務

  • 通過異步事件(如?@TransactionalEventListener)處理


6. 未啟用事務管理

場景

  • 忘記添加?@EnableTransactionManagement

  • 配置錯誤(如錯誤的?PlatformTransactionManager?Bean)

原因

  • Spring 未掃描到?@Transactional?注解或未創建代理。

解決方案

  • 確保配置類添加注解:

    java

    復制

    下載

    @Configuration
    @EnableTransactionManagement // 關鍵
    public class AppConfig { ... }
  • 檢查事務管理器 Bean 是否正確注入


7. 嵌套事務傳播行為不當

場景

java

復制

下載

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {methodB();
}@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodB() {// 如果methodA拋異常,methodB仍會提交
}

原因

  • REQUIRES_NEW?會掛起當前事務,獨立提交。若外層事務回滾,內層事務不受影響。

解決方案

  • 根據業務需求調整傳播行為(如改用?NESTED


8. 事務方法內捕獲異常未重新拋出

場景

java

復制

下載

@Transactional
public void process() {try {// 可能拋出異常的操作} catch (Exception e) {log.error("錯誤", e); // 僅記錄不拋出}
}

原因

  • 攔截器無法感知異常,事務標記為成功。

解決方案

  • 捕獲后手動回滾:

    java

    復制

    下載

    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  • 或重新拋出異常


總結:事務失效排查清單

失效場景關鍵特征驗證方法
自調用同類中非代理調用檢查是否通過?this?調用
非 public 方法方法為 private/protected查看方法修飾符
異常類型不匹配捕獲后未拋出或拋出受檢異常檢查異常處理邏輯
數據庫引擎不支持使用 MyISAM 引擎SHOW TABLE STATUS?查看引擎
多線程調用子線程內操作檢查是否有?new Thread()
未啟用事務管理無事務管理器 Bean檢查?@EnableTransactionManagement
嵌套事務傳播不當內外層事務相互影響檢查?propagation?配置
捕獲異常未處理try-catch 吞沒異常檢查日志是否有未拋出的異常記錄

終極調試技巧
在調試模式下查看目標對象類名:

  • 代理對象:com.sun.proxy.$ProxyXX(JDK)或?UserService$$EnhancerBySpringCGLIB

  • 原始對象:com.example.UserService
    若調用的是原始對象,則事務必然失效。

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

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

相關文章

使用unity創建項目,進行動畫制作

1. 創建unity項目 error: error CS0006: Metadata file Library/PackageCache/com.unity.collab-proxy2.8.2/Lib/Editor/PlasticSCM/log4netPlastic.dll could not be found error CS0006: Metadata file Library/PackageCache/com.unity.collab-proxy2.8.2/Lib/Editor/Plasti…

Centos系統及國產麒麟系統設置自己寫的go服務的開機啟動項完整教程

1、創建服務文件 在 /etc/systemd/system/ 下新建服務配置文件(需sudo權限),例如: sudo nano /etc/systemd/system/mygo.service 如下圖,創建的mygo.service 2、創建內容如下: DescriptionThe go HTTP a…

Java面試寶典: IO流

1. 下面哪個流類屬于面向字符的輸入流() 選項: A. BufferedWriter B. FileInputStream C. ObjectInputStream D. InputStreamReader 答案:D 詳細分析: 字符流與字節流的本質區別: 字符流(Character Streams)以Unicode字符為單位操作數據,適用于文本處理字節流(Byte…

黑馬python(二十五)

目錄:1.數據輸出-輸出為Python對象2.數據輸出-輸出到文件中3.綜合案例1.數據輸出-輸出為Python對象2.數據輸出-輸出到文件中移動文件到文件夾:生成了好多文件,因為Rdd是有分區的 ,會把數據分散到各個分區去存儲,因為電…

【LeetCode 熱題 100】41. 缺失的第一個正數——(解法一)暴力解

Problem: 41. 缺失的第一個正數 題目:給你一個未排序的整數數組 nums ,請你找出其中沒有出現的最小的正整數。 請你實現時間復雜度為 O(n) 并且只使用常數級別額外空間的解決方案。 文章目錄整體思路完整代碼時空復雜度時間復雜度:O(N log N)…

在運行 Laravel Sail 前,需安裝 Docker Desktop 并完成基礎配置/具體步驟

一、安裝 Docker Desktop(必備環境) Windows 系統 (windows安裝包 有兩個版本) 架構版本查看 1. Win R? 輸入 ?cmd? 打開命令提示符; 2. ?輸入命令?: bash echo %PROCESSOR_ARCHITECTURE% 3. ?結果…

AI 應用于進攻性安全

一、引言 大語言模型(LLM)和 AI 智能體的出現推動進攻性安全變革,其在偵察、掃描、漏洞分析、利用、報告五個階段展現出數據分析、代碼生成、攻擊場景規劃等能力,能提升安全團隊效率與擴展性,但存在 “幻覺” 等局限性…

微控制器中的EXTI0(External Interrupt 0)中斷是什么?

微控制器中的EXTI0(External Interrupt 0)中斷是什么? EXTI0(External Interrupt 0) 是微控制器(如STM32等ARM Cortex-M系列芯片)中的一個外部中斷線,專門用于處理來自特定GPIO引腳的外部信號觸發中斷。以下是詳細說明: 1. 基本概念 EXTI(External Interrupt/Event …

EasyGBS平臺內置AI算法了,算法成為了視頻平臺的標配

今年五一的時候立了個flag(《國標GB28181平臺EasyGBS未來研發方向在哪?》),我想不能再局限在只是滿足于傳統視頻平臺的功能,傳統的EasyGBS也就是接入幾種視頻協議,什么RTSP、ONVIF、RTMP、GB28181這些&…

C# 常量與變量

在 C# 中,常量和變量是存儲數據的基本方式: // 常量:使用 const 關鍵字聲明,必須在聲明時初始化,且值不能改變 const double Pi 3.14159; const string Message "Hello, World!"; ? // 變量:…

TensorRT-LLM:大模型推理加速的核心技術與實踐優勢

大型語言模型推理就像讓一頭300公斤的大熊貓玩平衡木——顯存消耗和計算效率這對雙胞胎問題隨時可能讓表演翻車。以主流的7B參數模型為例,FP16精度下僅模型權重就吃掉14GB顯存,這還沒算上推理過程中不斷膨脹的KV Cache——當處理2048長度的對話時&#x…

免費棱光 PDF:免安裝 加水印 去水印 批量格式轉換

各位辦公小能手們,今天給大家介紹一款超棒的PDF處理工具——棱光PDF!它完全免費,專門解決咱對PDF文件的常見操作需求。綠色免安裝,體積小得跟顆花生米似的,打開就能用。它有三大核心功能,分別是水印管理、格…

(二)復習(Error Pattern/Result Pattern/)

文章目錄 項目地址一、Error Pattern1.1 定義Error類1. ErrorType 可發生的錯誤類型2. Error類3. ValidataionError1.2 給每個實體創建Error類1. CategoryError類2. TicketErrror類3. EventErrror類二、Result Pattern1.1 自定義返回Result1. 泛型類2. 泛型方法1.2 Api層的Resu…

20250705-day6

NATO:北大西洋公約組織 Software Crisis:軟件危機 Paradigm:設計范型 Waterfall Model:瀑布模型 Prototype Model:原型模型(又稱快速模型) Spiral Model:螺旋模型 Agile:…

視頻播放中時鐘的概念及音視頻同步概念

author: hjjdebug date: 2025年 07月 05日 星期六 18:20:45 CST descrip: 視頻播放中時鐘的概念及音視頻同步概念 文章目錄 1.前言: 視頻播放:1. 固定延時時間2. 根據frame的duration來延時.3. 根據frame的PTS 來播放3.1. 時鐘是什么?3.2. 時鐘的用途. 2.音視頻同步: 1.前言: …

Python基礎之字符串操作全解析

在 Python 中,字符串是最常用的數據類型之一,掌握字符串的各種操作對于日常編程至關重要。本文將詳細介紹 Python 字符串的類型特性、編碼轉換、常用運算符及方法,幫助你全面掌握字符串處理技巧。 一、字符串的基本類型 Python 中的字符串屬…

【爬蟲】逆向爬蟲初體驗之爬取音樂

尋找數據 打開F12中的網絡頁面,播放音樂后,篩選媒體,會發現當前這首歌曲音頻鏈接地址,打開后,點擊“標頭”就能能看到請求URL 截取“.mp3”前面的一部分進行搜索,搜索出來了很多數據包,但都是…

CppCon 2018 學習:Fancy Pointers for Fun and Profit

“Fancy Pointers for Fun and Profit” 這個標題聽起來像是在討論**“高級指針用法”**,尤其是在C里,如何利用智能指針、定制指針類型,或者其他高級指針技巧來寫更安全、更高效、更優雅的代碼。 可能的理解和內容方向: 1. 什么是…

思辨場域丨數字信號技術重塑農林牧漁:從“靠天吃飯”到“靠數吃飯”

凌晨三點,山東萊蕪的養豬戶老李被手機震動驚醒。屏幕顯示:3號豬舍,母豬即將分娩。他輕點屏幕啟動遠程監控,翻身繼續入睡——而在幾年前,這樣的夜晚他只能在豬圈里守著。 清晨的茶園里,興業縣的茶農王大姐掏…

文心大模型及百度大模型內容安全平臺齊獲信通院大模型安全認證

近日,文心大模型與百度大模型內容安全平臺——紅線大模型雙雙榮獲中國信息通信研究院泰爾認證中心頒發的“大規模預訓練模型(文本生成功能)安全認證證書”,且二者的認證級別皆“增強級”的最高級別。 大規模預訓練模型&#xff08…