Spring Boot中@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

