@transactional事务失效场景

未启用事务管理 Spring Boot应用中需通过@EnableTransactionManagement显式启用事务管理(但多数情况下默认自动配置已启用)。检查配置类或主启动类是否遗漏该注解。

方法访问权限问题 @Transactional注解仅对public方法有效。若方法为private、protected或包级私有,事务将不生效。确保目标方法为public修饰。

自调用问题 类内部方法A调用带有@Transactional的方法B时,由于代理机制绕过Spring AOP,事务不生效。需通过依赖注入自身代理或拆分到不同类解决。

异常类型不匹配 默认仅对RuntimeException和Error回滚。若捕获了异常未抛出或抛出检查异常(如IOException),需配置rollbackFor属性:

复制代码
@Transactional(rollbackFor = Exception.class)

数据库引擎不支持 使用MyISAM等不支持事务的存储引擎会导致失效。确认数据库表使用InnoDB引擎:

复制代码
SHOW TABLE STATUS LIKE 'table_name';

多数据源未指定 多数据源环境下需明确指定事务管理器。通过transactionManager属性指定:

复制代码
@Transactional(value = "specificTransactionManager")

传播行为配置不当 PROPAGATION_NOT_SUPPORTED等传播行为会挂起当前事务。根据业务需求调整传播行为:

复制代码
@Transactional(propagation = Propagation.REQUIRED)

异步方法调用 @Async方法内的事务需单独声明,因异步执行在不同线程。确保异步方法本身也有@Transactional注解。

验证事务生效的方法

日志检查 开启Spring事务日志观察事务启停:

复制代码
logging.level.org.springframework.transaction.interceptor=DEBUG

手动回滚测试 在方法中抛出RuntimeException,确认数据是否回滚。这是最直接的验证方式。

数据库连接验证 检查JDBC连接是否设置为自动提交false:

复制代码
Connection conn = dataSource.getConnection();
System.out.println(conn.getAutoCommit()); // 应输出false
相关推荐
Joy T5 小时前
Agent 确定性上下文设计:从 Prompt 参数注入到能力分层
java·开发语言·微服务·架构·prompt·agent context
AIgorithmGEEK8 小时前
MySQL 索引全解(下):建、查、删实战与知识速查表
数据库·mysql·b+树·索引
m0_587383008 小时前
广州 24 小时自助健身房解决方案技术实现与实战指南
java·spring·小程序·架构·需求分析
·云扬·9 小时前
Prompt 工程与安全:从 System 设计到注入防御
java·人工智能·安全·ai·prompt
代码不停10 小时前
自动化测试(java)
java·开发语言·selenium·自动化
唠点键盘之外的10 小时前
26 向量数据库实战:从 0 搭一条能用的检索链路(pgvector + Spring AI)
数据库·人工智能·spring
云和恩墨11 小时前
数据库监控简史:监控不止于告警——从图表大爆发到健康管理闭环
数据库
ly768911 小时前
MongoDB 事务开销实测:快照隔离下的写冲突、重试与分片事务边界
数据库·mongodb·事务·分片集群·快照隔离·写冲突
豆角焖肉11 小时前
Spring AOP 自定义注解实现系统操作日志
数据库·自定义注解·springaop·操作日志·aop 切面
鬼手点金11 小时前
opencode-rules 插件
java·开发语言·前端·人工智能·chrome·git·github