首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

Spring Boot 整合 MySQL:@Transactional 註解事務不回滾問題排查與解決

     編輯:MySQL 綜合教學

Spring Boot + MySQL 註解式事務失效:MyISAM 引擎不支援交易導致不回滾

新專案採用 Spring Boot 簡化配置,持久層用 MyBatis,@Transactional 註解管理事務,測試發現例外拋出時資料未回滾。經排查發現並非框架配置錯誤,而是**資料表儲存引擎為 MyISAM**,該引擎**不支援交易**,導致事務管理器無法生效。

問題現象

  • Service 方法加 @Transactional
  • 刻意拋出 RuntimeException
  • 資料已寫入資料庫,未發生回滾
  • 無任何錯誤日誌輸出

根因分析

-- 檢查表引擎
SHOW CREATE TABLE your_table;
-- 結果顯示: ENGINE=MyISAM

MyISAM 特性:表級鎖、不支援交易、不支援外鍵、全文索引 (5.6 前)

InnoDB 特性:列級鎖、支援 ACID 交易、支援外鍵、MVCC、崩潰恢復

解決方案

  1. 修改現有表引擎:
    ALTER TABLE your_table ENGINE=InnoDB;
  2. 建表時指定引擎:
    CREATE TABLE t (
      id INT PRIMARY KEY AUTO_INCREMENT,
      ...
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  3. 設定預設引擎 (my.cnf):
    [mysqld]
    default-storage-engine=InnoDB

驗證事務生效

@Service
public class OrderService {
    @Autowired OrderMapper orderMapper;

    @Transactional(rollbackFor = Exception.class) // 建議明確指定回滾異常
    public void createOrder(Order order) {
        orderMapper.insert(order);
        // 模擬業務異常
        if (true) throw new RuntimeException("故意失敗");
    }
}

再次測試,資料應正確回滾。

延伸檢查清單

  • 所有業務表是否為 InnoDB
  • @Transactional 是否在 public 方法上 (私有/protected 不生效)
  • 是否為同類別內部呼叫 (繞過 AOP 代理)
  • 資料源是否正確配置 DataSourceTransactionManager
  • MyBatis Mapper 方法無 @Transactional (由 Service 層控制)
教訓總結: 框架配置再完美,若底層資料庫引擎不支援交易,事務永遠不會生效。建立資料表時**預設指定 InnoDB** 應成肌肉記憶。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved