You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

20 lines
1.5 KiB

4 weeks ago
---
status: accepted
---
# 线索状态迁移统一用状态 CAS 乐观锁防并发
crm-lead 的所有状态迁移(领取、分配、激活、释放、反馈、转商机)以及定时任务(回收、失效),其 `UPDATE lead` **一律带 `AND status IN (合法起始态)` 作为 compare-and-swap 条件;行数=0 即判定「已被他人操作」失败**。这把「并发防护」从散落在个别流程(原本只有转商机写了)提升为全局原则,让批量操作「部分成功」里的「失败」有确切定义 = CAS 行数 0。
## Considered Options
- **散在各流程各写各的**——被否:只有转商机写了状态 CAS,领取/分配/激活没写,会出现「两个销售同时领同一条待领取线索、后者静默抢走 owner」的漏洞。
- **行级悲观锁 / 全局版本号列**——被否:状态本身就是天然的乐观锁判据,无需额外 version 列;悲观锁在批量场景下开销与死锁风险都更高。
- **状态 CAS 全局原则(选中)**:零额外字段,语义清晰,人工操作与定时任务天然互斥(定时任务的 `WHERE status IN (...)` 同属此机制)。
## Consequences
- 所有写线索状态的路径都必须遵守此约定,新增状态迁移时不得省略 `AND status IN (...)`
- 批量领取/分配/激活均非原子、逐条 CAS,返回「成功 N 条、失败 M 条」。
- 决策来源:`.scratch/clue-module/线索业务-PRD.md` §6.0(2026-08-13 grill #8)。