V3.03.2Stale locks设计
遗忘释放的锁会阻塞他人
别名: 悬挂锁 · 忘记解锁 · 锁泄漏
概念解释
锁最常见的问题不是被人恶意占用,而是被遗忘:持锁人编辑完就走了、去开会了、关掉浏览器去吃午饭了,锁还挂在那里。此后所有想碰这块区域的人都被告知「已被占用」,而占用者本人对此一无所知。这种悬挂锁(stale lock)是锁定机制的标志性故障——它把排他性从「正在编辑」错位成「曾经编辑过」,系统的保护逻辑反而成了阻塞源。判定特征:锁的存在与持锁人的实际活动已无关联。
机制
锁的生命周期依赖持锁人的显式收尾动作(点完成、关闭、退出),而人的注意力恰恰在编辑结束时最涣散——工作已完成,心智已经移到下一件事,收尾动作是最容易被跳过的一步。锁的占用又与持锁人的后续状态完全脱钩:他离线、切窗、合上电脑,锁都不自知。两件事叠加,锁的存续时间系统性长于真实占用时间。阻塞的代价由等待者单方面承担,且往往伴随错误的归因——等待者以为是对方还在改,不好意思催促,反复刷新等待,实际上没有任何工作正在进行。多个区域被不同的遗忘锁挂住时,整个共享空间的可用面积以肉眼可见的速度萎缩。
边界
不是所有长时间持有的锁都是遗忘锁:有人确实在长时间打磨一个区域,此时长持锁是合理的。区分靠持锁人的活动信号(最近是否仍在编辑该区域),而不是单纯的时长。另外,遗忘锁的严重性与组织情境相关——熟人小团队里一条消息就能解决,大组织或跨时区团队里找到持锁人本身就要一天,此时悬挂锁的代价被时差放大。
怎么落地
- 把锁的释放从「显式动作」改为「默认自动」:检测到持锁人一段时间无活动即提示其确认释放,无响应则自动释放并通知。
- 锁界面上始终显示持锁人身份与最近活动时间,让等待者能区分「正在打磨」与「人已不在」。
- 给等待者一个不冒犯的催促通道(一键提醒)与一个越级的备选(申请强制释放),两条路都留记录。
- 验证:统计锁的平均持有时长与持锁人最后活动的间隔——两者差值(悬挂时长)占持有时长的比例,就是遗忘锁的规模;目标是把这个比例压到接近零。