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,和默认规则不匹配也会导致事务不生效。 - 数据库连接默认自动提交未关闭:如果连接默认开启自动提交,会绕过事务控制直接写入数据。
修复步骤
- 替换注解导入:删除
PersonService类中的import javax.transaction.Transactional;,替换为import org.springframework.transaction.annotation.Transactional; - 修正事务管理器配置,二选一即可:
- 将HibernateConf类中
hibernateTransactionManager方法名改为transactionManager - 给
@EnableTransactionManagement注解添加属性:@EnableTransactionManagement(transactionManagerRef = "hibernateTransactionManager")
- 将HibernateConf类中
- 检查修改MySQL表引擎:执行SQL
ALTER TABLE 你的person表名 ENGINE=InnoDB;切换为支持事务的InnoDB引擎 - 可选优化:在HibernateConf的
hibernateProperties方法中添加如下配置,关闭自动提交:hibernateProperties.setProperty("hibernate.connection.autocommit", "false");
完成上述修改后重启服务测试,抛出RuntimeException后事务会正常回滚,数据不会持久化到数据库。
内容的提问来源于stack exchange,提问作者Pablo Lanza
相关产品推荐
相关产品推荐

