近期有开发者反馈,在 Spring Boot 项目中添加了 @Transactional 注解后,事务并未按预期回滚。经过排查,发现了一个容易被忽略的配置细节。
核心原因
很多示例代码中往往忽略了 Hibernate 方言的配置。关键在于以下属性:
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
这个配置决定了 Hibernate 使用的数据库方言。特意指定 MySQL5InnoDBDialect 是为了确保在使用 Spring Data JPA 自动建表时,强制使用 InnoDB 存储引擎。如果缺少此配置或配置错误,Hibernate 可能会默认使用 MyISAM 引擎。
为什么这很重要?
MyISAM 存储引擎本身不支持事务机制。一旦表使用了 MyISAM,无论 Java 层如何配置 @Transactional,数据库层面都无法保证原子性,导致事务失效。
排查建议
如果你的事务没有生效,建议优先检查数据库中相关表的存储引擎类型。如果是 MyISAM,请补充上述方言配置并重建表结构,即可恢复事务支持。

