回滚到旧版本时需要处理其他协作者尚未同步的改动
别名: 回滚与未同步 · restore vs pending · collaborator pending
概念解释
把文档恢复到某一份历史快照时,别人可能还在自己的会话里打着尚未同步的字,或已经同步但比那份快照更新的句子。处理尚未同步的改动指:回滚不能只把当前稿换成旧快照就结束,必须交代这些人的差额会去哪——并入、保留在他们的会话、变成冲突、或明确丢弃并通知。它是回滚在协作现场的后果。历史能不能对照、恢复对操作者能不能撤销,是另一组问题;这里专管「别人手里还拿着的那些字」。
机制
回滚改的是共享当前稿。协作者的未同步缓冲活在另一台机器上,回滚发生时他们的保存会变成一次对「已经变旧的当前」的写入。若产品按后写覆盖,回滚会被几秒后的同步悄悄打回去,操作者以为已经回到上周,实际又被未同步的新句盖住。若产品丢弃未同步缓冲,别人会遭遇静默丢失。正确的处理是把回滚当成一次与在场会话相关的事件:在场的人收到「当前稿被恢复到某时」,他们的缓冲进入冲突或另存,而不是继续往旧快照上盲写。不在场、稍后才同步的人同样要在下一次连接时看见这件事,而不是把缓冲当最新稿存进去。
怎么研究
甲回滚到较旧快照;乙离线或延迟着打了新句。比较:乙同步后覆盖回滚、乙缓冲消失、乙看到冲突并选择。
自变量:回滚是否通知在场者、乙的缓冲进入冲突还是直接写入、不在场者稍后同步的行为。 因变量:回滚是否被打回、乙是否丢失句子、甲是否知道回滚没站住。
两人若能口头协调,测不到界面事件。要隔离。不要把「甲自己撤销回滚」当成乙的未同步处理。版本列表是否好看不是这项的因变量。
边界
单人文档没有未同步协作者,回滚只影响自己的设备;多设备未同步应按同一规则当「另一个自己」。实时字符级合成若能把乙的新句和旧快照自动并在不撞车的位置,可以少弹冲突,但仍要让乙知道发生过回滚,否则乙会以为自己改的是当前时间线。没有历史权限的人不应被要求裁决回滚冲突。
怎么落地
- 回滚前列出当前在场的可写者,并写清「他们未保存的编辑将进入冲突 / 将丢失」。
- 回滚后向在场与稍后同步的可写者发事件,禁止他们的缓冲在无提示下写成新的当前稿。
- 给乙一条明确路径:把缓冲并入回滚后的稿、另存一份、或丢弃。
- 验证:乙在延迟下打一句,甲回滚。乙回来后那一句既不能无声消失,也不能无声打回甲的回滚。甲刷新后应仍看到自己选的快照,除非乙明确选择覆盖。