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.
 
 
 
 
 
 

1.5 KiB

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)。