标准答案

  1. 全局锁能快速保护整体不变式,但所有无关请求也会互相等待,尾延迟容易随负载上升。
  2. 按租户、账户、库存 SKU 或分片加锁可以提高并行度,但必须保证访问路径使用同一粒度和稳定顺序。
  3. 短临界区只包含读写共享状态,不把网络调用、慢查询和用户回调放在锁内。
  4. 通过竞争率、持有时间、等待时间和业务正确性测试评估是否需要细化。

题目解析

锁粒度应该对应真正共享的不变式。全局锁容易实现,但无关租户和资源也会互相等待;按账户、SKU 或分片细化后,并行度提高,同时要承担更多锁键和组合管理。

细粒度锁只有在所有代码路径使用同一资源映射和加锁顺序时才安全。临界区应只包含必要的状态读写,外部 RPC、慢查询和用户回调都应移到锁外。

是否需要细化要用竞争率、持有时间、等待时间和业务正确性压测判断。低并发下看不出锁顺序和热点问题,生产流量分布才是重要输入。

常见误区

  • 误区:把外部 RPC 放在锁内。改正:锁内只做短小的本地或事务状态操作,外部结果用状态机和幂等补偿表达。
  • 误区:不同代码路径使用不同加锁顺序。改正:为资源建立全局排序或统一封装,避免循环等待。
  • 误区:只测低并发下的锁实现。改正:使用热点和多资源组合压测,观察竞争、持有时间、P99 和死锁。

作者信息