27 lines
2.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

下面把 **传播行为** 拆成“**有父事务时怎么做**”和“**无父事务时怎么做**”两个维度,比原来的「是否必须有父事务 / 是否会新建事务」更直观——一眼就能看出它在两种场景下的动作差异。
| 传播行为 | **父事务已存在时** | **父事务不存在时** | 典型用途 / 说明 |
| ----------------------- | -------------------------------------------------- | ------------------------------------ | ------------------------------------------ |
| **`REQUIRED`** *(默认)* | **加入父事务**→ 共提交 / 回滚 | **创建新事务** | 日常业务写操作,保持一致性 |
| **`REQUIRES_NEW`** | **挂起父事务****自己新建事务** | 自己新建事务 | 写日志、发送 MQ 等:外层失败也要单独成功 |
| **`SUPPORTS`** | 加入父事务 | **非事务方式执行** | 只读查询:有事务跟随一致性,没有就轻量查询 |
| **`NOT_SUPPORTED`** | **挂起父事务**→ 非事务方式执行 | 非事务方式执行 | 大批量/耗时操作,避免长事务锁表 |
| **`MANDATORY`** | 加入父事务 | **立即抛异常** | 防御性编程:强制要求调用方已开启事务 |
| **`NEVER`** | **立即抛异常** | 非事务方式执行 | 禁止在事务里跑的代码(如特殊 DDL |
| **`NESTED`** | 同一物理事务,打 **SAVEPOINT**→ 子回滚只回到保存点 | 创建新事务(与 `REQUIRED` 效果相同) | 分段回滚;需 DB / JDBC 支持保存点 |
### 使用 Tips
- **不想被外层事务拖垮** ➜ `REQUIRES_NEW`
- **可有可无事务的读操作** ➜ `SUPPORTS`
- **耗时任务要彻底裸跑** ➜ `NOT_SUPPORTED`
- **局部失败但整体继续** ➜ `NESTED`(保存点)
- **强约束外层必须有事务** ➜ `MANDATORY`
- **坚决拒绝在事务里执行** ➜ `NEVER`
这样,你只需关心:
> *「现在有没有父事务?✚ → 该传播行为会怎么做?」*
就能快速判断是否满足你的业务需求。