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

Spring Boot中@Transactional注解事务不回滚问题排查

Spring @Transactional注解回滚日志存在但实际未回滚的排查方案

以下是几个可能导致该问题的原因及对应解决方法:

  • 抽象类上的事务注解无法被代理
    你的MyDao是抽象类,Spring的事务代理机制针对的是被容器管理的具体Bean。抽象类的方法即使标注了@Transactional,如果没有对应的具体实现类被Spring正确托管,代理逻辑无法生效。
    解决:将@Transactional(rollbackFor = Exception.class)移到MyDao的具体实现类的updateSomething()方法上,同时确保实现类被Spring注解(如@Component、@Repository)标记并被扫描到。

  • 数据库引擎不支持事务
    若使用MySQL,旧版本默认的MyISAM引擎不支持事务。即便Spring日志显示触发了回滚,数据库层面也不会执行回滚操作。
    解决:执行SHOW CREATE TABLE 你的表名;查看表引擎,若为MyISAM,执行ALTER TABLE 你的表名 ENGINE=InnoDB;修改为支持事务的InnoDB引擎。

  • JDBC连接自动提交开启
    如果数据源配置中autoCommit被设为true,每条SQL执行后都会自动提交,Spring的回滚操作会完全失效。
    解决:检查数据源配置,确保关闭自动提交。比如HikariCP配置中添加auto-commit: false,或者在数据源初始化时设置connection.setAutoCommit(false)。

  • 事务代理对象被绕过
    若MyDao的实例是手动new出来的,而非通过Spring依赖注入获取,那么该实例没有被事务代理包装,@Transactional注解自然不生效。
    解决:确保MyService中的myDao是通过Spring注入的,检查MyDao实现类是否被Spring扫描并注册为Bean,避免手动实例化。

  • 异常被提前捕获未抛出
    虽然你提到移到Service层并移除了try-catch,但如果存在其他代码路径捕获了异常且未重新抛出,Spring事务管理器无法感知异常,不会触发回滚。需确保事务方法抛出的异常能传递到事务管理器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 14:06:55