核心区别在于事务是否共享及异常回滚是否互相影响:required复用同一连接、一损俱损、生命周期由外层决定;requires_new新建连接、各自回滚、提交立即生效,适用于日志等解耦场景。

核心区别在于:事务是否共享,以及异常回滚时是否互相影响。
事务是否复用同一个物理连接
REQUIRED 复用当前线程已绑定的数据库连接(Connection),整个调用链只用一个 Connection;REQUIRES_NEW 每次都申请新连接,旧事务的连接会被临时挂起,执行完再恢复。
- REQUIRED 场景下,即使跨多个 service 方法,只要都在同一调用链且没中断,底层 SQL 都走同一个数据库连接
- REQUIRES_NEW 会触发连接池分配新连接,可能带来额外开销,也意味着锁、隔离级别等都独立生效
异常发生时的回滚范围
REQUIRED 是“一损俱损”:内层方法抛出未捕获异常,会导致整个外层事务回滚;REQUIRES_NEW 是“各自负责”:内层回滚不影响外层提交,但外层若失败,也不会挽救已提交的内层事务。
- 比如订单创建中调用日志记录方法,日志失败不该让订单创建失败 → 用 REQUIRES_NEW
- 比如转账操作中扣款和入账必须同时成功或同时失败 → 两个方法都用 REQUIRED
事务数量与生命周期管理
REQUIRED 最多只产生一个事务(有则加入,无则新建);REQUIRES_NEW 每次调用都开启全新事务,即使嵌套在另一个事务里,也会形成两个独立的事务上下文。
- REQUIRED 的事务生命周期由最外层方法决定,中间任何一层都不能提前提交
- REQUIRES_NEW 的事务一旦 commit,结果立即可见,不受外层事务后续回滚影响
实际选型建议
大多数业务逻辑默认用 REQUIRED 就够了;只有明确需要解耦事务边界时,才选 REQUIRES_NEW。
- 审计日志、消息发送、通知推送等“事后动作”,适合 REQUIRES_NEW
- 涉及主业务数据一致性操作(如增删改查联动),优先 REQUIRED
- 注意:REQUIRES_NEW 不是“更安全”的选项,它只是把事务拆开了,反而可能引入最终一致性问题
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











