标准答案

  1. 如果数据库唯一约束能表达“只能成功一次”,应优先让数据库裁决,而不是维护一个易失的锁。
  2. 状态机适合限制合法状态转移,队列适合把同一业务 Key 的工作串行化并保留处理记录。
  3. 确需分布式锁时,要有持有者标识、过期、续租、安全释放、fencing 和失败恢复。
  4. 锁内只做短小、可验证的协调工作,不能把网络调用和长事务放进去。

题目解析

如果重复创建可以由唯一约束表达,应该让数据库在最终写入点裁决;如果问题是合法状态转换,应使用状态机;如果工作可以按业务 Key 排队,队列通常比跨节点锁更容易恢复和审计。

分布式锁只适合短暂协调,而且锁服务、网络和业务存储可能有不同故障边界。锁成功不代表业务已经提交,锁过期也不一定能停止旧持有者。

确需使用时,至少要有持有者 token、过期和续租、原子安全释放、接管后的 fencing,以及失败后可查询和补偿的业务状态。

常见误区

  • 误区:所有防重复都使用分布式锁。改正:先判断唯一约束、状态机或按 Key 队列能否直接表达不变式。
  • 误区:只用 SET NX,没有过期和安全释放。改正:使用带 token 的原子加锁、过期策略和比较 token 后释放。
  • 误区:锁成功就相信业务一定完成。改正:锁只提供协调,业务结果仍要落库、幂等和可恢复地记录。

作者信息