事务模型(Transaction Model)
快速概览
Loro 的事务并非数据库中的 ACID 事务。 它们用于打包操作并控制事件触发。
核心概念
- 目的:把相关操作打包,并控制事件何时触发
- 不提供回滚:操作失败不会撤销之前的变更
- 事件批处理:一次事务中的所有操作对应一条事件
- 历史分组:操作在撤销 / 重做时保持在一起
基本用法
const = new ();
// 未使用事务——会产生多条事件
const = .("text");
.(0, "Hello");
.(); // 触发事件
.(5, " World");
.(); // 再触发一次事件事务的运行机制
待提交的操作
本地操作默认处于 pending 状态,在提交前不会触发事件:
const = new ();
const = .("text");
// 操作处于 pending 状态,暂未触发事件
.(0, "Hello");
// 显式提交后触发事件
.();隐式提交
某些操作会自动触发隐式提交:
const = new ();
const = .("text");
.(0, "Hello"); // Pending 操作
// 以下操作会触发隐式提交:
.(); // 在导入前隐式提交
// 或
.(.()); // 在 checkout 前隐式提交
// 或
.({ : "update" }); // 在导出前隐式提交事务的保证
- 所有操作共享同一个时间戳(若启用)
- 操作会被归入同一个 Change
- 事务完成后只触发一次事件
- 操作在事务末尾一并提交
- 在提交之前,本地编辑不会同步给其他节点
相关文档
- Operations 与 Changes——事务如何生成 Change
- 事件系统——理解事件触发
- 撤销 / 重做——利用事务定义撤销边界