You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring+Hibernate环境下@Transactional注解服务方法回滚失效问题

Spring+Hibernate事务不回滚问题解决方案

核心故障点

服务层@Transactional注解导入错误:你当前导入的是javax.transaction.Transactional(Java EE原生事务注解),Spring声明式事务默认仅识别org.springframework.transaction.annotation.Transactional注解,导致方法未被事务代理拦截,抛出异常后自然不会触发回滚。

其他潜在故障点

  • MySQL表存储引擎不支持事务:如果Person表使用的是MyISAM引擎,本身就不具备事务能力,无论配置是否正确都不会回滚。
  • 事务管理器Bean名称不匹配:Spring默认寻找名为transactionManager的事务管理器Bean,你当前配置的事务管理器Bean名称为hibernateTransactionManager,和默认规则不匹配也会导致事务不生效。
  • 数据库连接默认自动提交未关闭:如果连接默认开启自动提交,会绕过事务控制直接写入数据。

修复步骤

  1. 替换注解导入:删除PersonService类中的import javax.transaction.Transactional;,替换为import org.springframework.transaction.annotation.Transactional;
  2. 修正事务管理器配置,二选一即可:
    • 将HibernateConf类中hibernateTransactionManager方法名改为transactionManager
    • 给@EnableTransactionManagement注解添加属性:@EnableTransactionManagement(transactionManagerRef = "hibernateTransactionManager")
  3. 检查修改MySQL表引擎:执行SQL ALTER TABLE 你的person表名 ENGINE=InnoDB; 切换为支持事务的InnoDB引擎
  4. 可选优化:在HibernateConf的hibernateProperties方法中添加如下配置,关闭自动提交:
    hibernateProperties.setProperty("hibernate.connection.autocommit", "false");
    

完成上述修改后重启服务测试,抛出RuntimeException后事务会正常回滚,数据不会持久化到数据库。

内容的提问来源于stack exchange,提问作者Pablo Lanza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 05:39:05