lww是依赖前端时间戳比对与服务端权威校验的同步策略,非html5原生能力;需用iso毫秒级时间戳、服务端强制覆盖决策、前端冲突处理及避免多标签页重复提交等机制共同实现。

“最后写入胜出”(Last Write Wins,LWW)不是靠 HTML 标签或属性实现的,它是一套由前端逻辑、服务端接口和数据结构共同支撑的同步策略。HTML5 本身不参与冲突判断,真正起作用的是 JavaScript 层的时间戳比对与服务端的权威校验。
用客户端时间戳标记每次变更
每次用户修改字段、提交表单或编辑文档时,前端生成 ISO 格式时间戳作为本次操作的唯一时序标识:
- 统一用 new Date().toISOString() 生成,避免本地时区偏差
- 把该时间戳作为 updated_at 字段随数据一起提交(例如在 fetch 的 body 中)
- 服务端不信任客户端时间,仅将其存为元数据,用于后续 LWW 决策
服务端强制执行 LWW 规则
服务端收到写请求后,需完成三件事:
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
- 读取当前数据库中该记录的 server_updated_at(服务端生成的权威时间戳)
- 比较客户端传来的 updated_at 与服务端当前值:若客户端时间更晚,则覆盖;否则拒绝并返回 409 Conflict
- 无论是否覆盖,响应体必须包含最新版的 server_updated_at,供前端做 UI 同步或重试判断
前端响应冲突并保持状态一致
当 fetch 收到 409 响应时,不能简单报错,而要主动同步最新状态:
- 立即发起一次 GET 请求拉取服务端当前完整数据
- 将新数据合并进本地 IndexedDB,并更新对应记录的 server_updated_at 和 status
- 如果页面正在编辑,可高亮提示“他人已更新”,并可选保留用户本地草稿供手动合并
- 不删除本地 pending 记录,而是标记为 conflicted,留待人工确认或后台自动重试
避免 LWW 的常见陷阱
看似简单的“谁最后谁赢”,实际落地容易翻车:
- 别用 localStorage 存时间戳做比对——它无事务、不同步、跨标签页事件不可靠
- 别依赖 秒级 UNIX 时间戳,精度不够,高并发下极易误判;必须毫秒级 ISO 字符串
- 别让多个标签页同时提交同一份数据——每个编辑会话应带唯一 clientId,服务端可据此过滤重复提交
- 纯 LWW 会丢数据(比如 A 改标题、B 改正文),如需更高保真,应在 LWW 基础上叠加字段级合并或 OT/CRDT 策略
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










