Spring 事务失效的常见原因
Spring 事务用起来简单,但失效场景非常多。很多人遇到过 @Transactional 不生效的情况,却不知道原因。本文把日常开发中常见的坑和对应的排查思路整理出来,帮你避免踩坑。
先搭一个最小接口
以 Spring Boot 为例,一个接口最好保持分层清楚:
|
Controller 只负责接收请求和返回结果,业务逻辑放到 Service。这样代码更容易测试,也更容易维护。
配置和验证
如果涉及环境配置,建议拆分:
spring: |
生产环境启动时不要手工改文件,可以通过参数指定:
java -jar app.jar --spring.profiles.active=prod |
接口写完后,用 curl 验证:
curl http://localhost:8080/users/1 |
常见坑
- 事务方法必须通过 Spring 代理调用,类内部直接调用可能导致事务不生效。
- Controller 不要返回 Entity,避免数据库字段直接暴露。
- 参数校验和异常处理最好统一做,不要散落在每个接口里。
核心要点
事务失效的常见原因:非 public 方法、自调用、异常被吞掉、错误的传播级别
事务传播级别决定了方法之间的事务关系,REQUIRED 是默认值
使用 @Transactional(rollbackFor = Exception.class) 确保异常回滚
编程式事务在某些场景下比声明式事务更灵活
总结
事务管理是保证数据一致性的关键。理解事务的工作机制和常见陷阱,能帮你写出更健壮的代码。在实际项目中,合理配置事务边界非常重要。