手机和平板都改了同一任务,最后谁覆盖谁:HarmonyOS 7 多设备逻辑时钟与冲突合并
手机离线把任务改成“已完成”,平板同时修改了备注;重新联网后,系统按本机时间取较新记录,结果备注或完成状态有一项消失。多设备协同不能把墙上时钟当唯一真相:设备时间可能偏差,两个修改也可能发生在不同字段。需要先判断因果关系,再决定覆盖、合并或让用户选择。
验证范围:官方页面用于确认 HarmonyOS 7/API 26 的能力方向;文章代码只验证应用侧状态、预算或一致性模型。当前电脑是 API 24 SDK,且没有连接 HarmonyOS 7 真机,所以下面的断言不是 API 26 编译、设备性能或线上效果证明。
用离线并发制造冲突
让手机和平板从版本 5 同时离线:手机改完成状态,平板改备注;将平板系统时间调快五分钟再同步。若只用更新时间,平板会覆盖手机完成状态。测试应使用逻辑版本而非真实改系统时间。
案例一:不同字段可以自动合并
完成状态和备注来自同一基础版本但修改字段不重叠,可以生成版本 6,保留两边变化,并记录合并来源。
案例二:同一字段冲突需要策略
两端都修改任务标题,不能静默拼接。可以按业务优先级、设备角色或用户确认解决,但必须保存被覆盖版本用于恢复。
时间更新晚不等于因果更新新
物理时间只能表示设备自认为的先后,无法证明两个离线修改的因果关系。逻辑版本和基础版本能区分“基于旧数据覆盖”与“确实在新版本之后修改”。
typeChange={base:number;fields:Set<string>;device:string};functionrelation(a:Change,b:Change){constoverlap=[...a.fields].some(x=>b.fields.has(x));returna.base===b.base&&!overlap?'merge':'conflict';}consta={base:5,fields:newSet(['done']),device:'phone'};constb={base:5,fields:newSet(['note']),device:'tablet'};if(relation(a,b)!=='merge')thrownewError('独立字段没有自动合并');这段模型用确定输入验证“从同一基础版本出发的非重叠字段可以合并,重叠字段进入冲突策略”。它适合先发现边界错误,但不会冒充平台接口或设备性能测试。
三种冲突策略
| 方案 | 适用范围 | 主要风险 |
|---|---|---|
| 按本机时间覆盖 | 单设备数据 | 时钟偏差丢修改 |
| 整条记录版本号 | 字段总是一起改 | 不同字段也互相覆盖 |
| 字段级版本与基础版本 | 多设备离线编辑 | 元数据和合并逻辑更复杂 |
核心协同数据采用基础版本加字段级修改集;同字段冲突保留双方版本并执行明确策略。设备时间只用于展示,不决定真相。
封装字段级版本
封装VersionedPatch,包含实体 ID、baseVersion、字段补丁、deviceId 和操作 ID。同步层输出 merged/conflict/rejected 三种明确结果。
恢复联网后验证收敛
- 设备时间偏差不会改变合并结论。
- 不同字段修改最终都保留。
- 同字段冲突不会静默覆盖。
- 重复同步同一 operationId 只应用一次。
- 三台设备最终收敛到同一版本。
多设备体验不是“最后写入者赢”就够了。让冲突可解释、可恢复,用户才敢在不同设备上连续工作。
官方资料
- HarmonyOS 7 新能力
- 2026 年 9 月开发者月刊
- HarmonyOS 应用开发指南