报告 009 · 取消竞争、备份恢复与冲突证据
日期:2026-09-19。受控进程与本地 SQLite 实验,不是数据库集群、Kubernetes 或设备验证。
1. 条件与执行
先固定 18 例预登记,再编写独立脚本。provider 保存进入/关闭状态,world 独立追加效果,authority 保存证据与资源账务;库间无事务。Python 3.14.7、SQLite 3.53.4,WAL/FULL,子进程通过管道屏障协调。
备份和恢复使用 SQLite backup API,并在实验进程已退出、连接关闭后进行。world 不随 provider 回退,模拟真实效果不因业务备份恢复而撤销。恢复分支只读 provider 状态,效果表用于评分。B4/B5 的入口关闭、旧进程隔离和新工作资源/预算核对由实验驱动保证,不是自动灾备实现。
首次完整运行通过:18 例、52 个子进程、2 次 SIGKILL、270 项检查,错误 0。原始 JSON 保存事件、参数、中间状态和终态。所有子进程均按预期退出,无兜底清理强杀;断言数含屏障/退出码,不是独立样本数,也不表示故障概率。
当时的 docker 命令实际进入 Podman,查询配置因运行目录只读失败,未启动容器或安装软件。实际成绩仅来自上述 SQLite 与受控子进程条件;其他数据库、集群及网络协议的恢复/取消行为未计入通过数。
2. 对照结果
| 场景 | 观察 | 设计含义 |
|---|---|---|
| A1 缓存进入状态 | 取消已返回 closed,旧执行者仍产生效果 1 | 入口不能依据事务外缓存放行 |
| A2 取消先提交 | 后续进入被拒,效果 0 | 关闭与进入在同一记录上互斥 |
| A3 进入先提交 | 取消仅返回 cancel_requested,最终效果 1 | 已进入的取消不是未执行证明 |
| A4 关闭提交后丢确认 | 重试仍 closed,后续进入拒绝 | 查询/重试应复用关闭状态 |
| A5 关闭提交前终止 | 回滚为 queued,后续效果 1 | 未提交请求不能被解释为取消完成 |
| A6 取消早于接纳 | 墓碑拒绝迟到接纳及进入 | 无记录也要关闭原请求的未来入口 |
| A7 真实事务竞争 | 本实验进入赢,取消仅受理,效果 1 | 结局符合二选一;另一个顺序由 A2 固定覆盖 |
| B1 旧快照重用代号 1 | 历史代号 2 已完成,旧代号 1 再产生效果,累计 2 | 持久记录也可因恢复而倒退 |
| B2 恢复后仅加一 | 再次得到历史代号 2,累计效果 2 | 加一不能证明超过丢失的历史 |
| B3 仅更换 RecoveryID | 旧身份被拒,但新身份重发原键,累计效果 2 | 新身份不能替代效果去重/核对 |
| B4/B5 隔离旧键后开放新工作 | 相同 provider 终态对应原效果 1/0;原键被拒,新键均完成 1 | 恢复歧义须保留,同时允许经独立核对的新责任推进 |
| C1 相同事件覆盖内容 | running 被 stopped 覆盖,版本仅 1,返还额度 1 | 已到达的矛盾证据被抹掉 |
| C2 保留内容版本 | 两份内容均保留,预留 held,额度 0 | 同一事件内容冲突阻止自动结算 |
| C3 完全相同的重送 | 证据版本 1、释放账 1、outbox 1,额度 1 | 正常重送可幂等处理,不必冻结 |
| C4 事务外缓存证据 | 矛盾已持久接入,缓存入账仍返还额度 1 | 保存冲突但不参与提交检查仍不够 |
| C5 入账时复核 | 同样到达顺序下拒绝入账,额度 0、预留 held | 证据可用性必须在提交时重新判定 |
| C6 结算后才到矛盾 | 原账及已返还额度保留,资源待核对,新分配拒绝 | 迟到矛盾产生新核对责任,不覆写历史或假装已撤销物理释放 |
A1 的最终状态为 finished,中间 closed 及回执见轨迹;不能只查终态漏掉错误承诺。C1/C4 的失败含义是“在已知矛盾下仍自动结算”,不是证明哪一条证据在物理上为真。C6 没有先分配 r2 再撤回的实验,因此不保证能追回已分配容量。
3. 采用与否决
- 采用取消与进入同一事务裁决。 queued 可关闭,缺失键保留关闭墓碑;entered 只记录取消请求,另外跟踪实际停止和效果。提交后才确认关闭。
- 采用受控恢复关闭流程。 旧快照恢复先保持入口关闭、隔离旧执行者、登记新 RecoveryID,再重建指派、预算及历史责任。丢失连续性的旧键默认待核对,不能由新身份自动重发。
- 采用不可覆盖的证据与冲突状态。 source+ProofID 的相同内容是重送,不同内容保留为冲突;入账事务检查冲突。结算后才到矛盾,保留原账并暂停受影响资源的新分配,追加核对责任。
否决缓存 queued 放行、恢复后计数加一即可复用、新 UUID 即可重放、最后到达证据覆盖、仅事务外检查证据五种充分性保证。详细协议、资料支持与剩余验收见恢复决策。
4. 范围与限制
实验覆盖指定时序,并非穷尽并发。SQLite 的写锁代替了真实多行并发,未验证 PostgreSQL 中的锁顺序、隔离重试、复制、主权或数据掉电耐久性。A7 只运行一次真实竞争,不作统计结论。
B4/B5 不测试“外部恢复控制本身也被还原”“仍活跃旧工作越过屏障”或“备份中不存在的已发生请求”。实际恢复须覆盖丢失日志区间及可能迟到的旧请求,不能只隔离快照里看得到的 queued。来源认证、新 RecoveryID 不复用、资源独立性及预算重建均为假设;身份必须由接收方验证,单改发送端字段没有意义。
C 只覆盖同 source+ProofID 的互相矛盾内容及一个资源域。不同事件、不同来源、不同时间的事实可能是正常状态变化,不能一概当冲突;自动语义判断、证据修正权限、冲突消解后解封和已重分配资源的处理均待验证。固定小对象的 SHA-256 内容比较不是密码学认证或通用证据判真。
运行命令见预登记;输出路径排他创建,复跑必须换路径。本实验没有修订或重跑。旧 E0~E8d 证据保持不变。
| 文件 | SHA-256 |
|---|---|
| 预登记 README.md | 92c4ea467ce57003e3857587570e2ace5254d916d5f52a9b54f988c62383bc73 |
| experiment.py | eab37547550ea66082e3385f354d2c1a6309ae74fd21e88ba556a014b7d6bf09 |
| cancel-restore-evidence.json | e670d184debd08cadcb93e329e8b616d147b8171f51a29042ebb34618e86012b |
数据可用性
本报告公开实验条件、汇总统计和失败分析。原始输入、脚本及逐次运行记录未随报告发布,因此不能仅凭本文独立复现实验。