首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【SpringBoot】Spring 事务的失效问题

【SpringBoot】Spring 事务的失效问题

原创
作者头像
lirendada
发布2026-08-25 10:49:15
发布2026-08-25 10:49:15
60
举报
文章被收录于专栏:JavaJava

Spring 事务的失效问题

一、调用方式不对(自调用)💥

  • 场景:在同一个类里,一个方法调用另一个加了 @Transactional 的方法。
  • 原因:Spring 事务是通过代理实现的,内部方法调用不会走代理,事务不会生效。
  • 解决:把需要事务的方法放到另一个类里,或通过 AopContext 获取代理调用。

二、方法不是 public💥

  • Spring 默认只对 public 方法生效。
  • 如果 @Transactional 标注在 privateprotecteddefault 方法上,事务不会生效。

三、异常没抛出💥

  • 默认回滚规则:Spring 只会对 运行时异常(RuntimeException 或其子类) 回滚。
  • 如果你捕获异常后没抛出,事务不会回滚。
  • 如果抛的是受检异常(如 IOException),默认也不会回滚。
  • 解决:
    • 重新抛出运行时异常。
    • 或在注解里指定 rollbackFor
    代码语言:javascript
    复制
    @Transactional(rollbackFor = Exception.class)

四、数据库引擎不支持事务

  • MySQL 如果表引擎是 MyISAM,不支持事务,事务自然无效。
  • 必须用 InnoDB 才能支持。

五、多线程调用💥

  • 如果事务方法里开了新线程,线程里的操作不受当前事务控制。
  • 解决:避免在事务方法里直接用多线程,或者手动管理事务。

六、配置问题

  • @EnableTransactionManagement 没配置。
  • 事务管理器没有正确注入。

七、手动设置了传播属性

  • 如果事务传播属性设置不当(如 PROPAGATION_NEVER),也会导致失效。

快速排查清单

  1. 方法必须是 public
  2. 确保是代理调用(不是同类内调用)
  3. 确保异常能抛出,没被吞掉
  4. 数据库表必须支持事务
  5. 确认 Spring 的事务配置启用

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • Spring 事务的失效问题
    • 一、调用方式不对(自调用)💥
    • 二、方法不是 public💥
    • 三、异常没抛出💥
    • 四、数据库引擎不支持事务
    • 五、多线程调用💥
    • 六、配置问题
    • 七、手动设置了传播属性
    • ✅ 快速排查清单
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档