← 中文资源

简体中文版本

为受保护写入添加围栏令牌

为每次写入附加单调递增令牌,并在存储层拒绝旧令牌,使暂停的锁持有者无法覆盖新数据。

阅读英文原文

只有锁还不够

租约可能在持有者暂停时过期。持有者恢复后仍以为自己有锁;如果它写入共享存储,就可能覆盖新持有者的工作。围栏把领导权变成单调令牌,并让存储拒绝陈旧写入。

term 7 token 7 -> write accepted
lease expires, term 8 token 8 -> write accepted
old holder resumes -> write token 7 -> rejected

在资源层执行

防护必须与写入处于同一原子操作。更新语句中的 WHERE last_token < $token 是原子的;分离的读取-检查-写入不是。返回新令牌或影响行数,让调用方区分成功与陈旧拒绝。

测试暂停

先获取令牌 1,再获取令牌 2,然后用令牌 1 发起写入,模拟暂停。断言旧写入失败且新值保留。围栏不能替代幂等性;使用当前令牌的重试写入仍应安全。

验证陈旧写入

预期结果:使用旧令牌的写入更新零行,返回可区分的陈旧结果,并保留较新的值。用获取两个令牌并在第二个写入后重放第一个的测试确认。还要验证令牌序列在进程重启后仍延续;每进程计数器会重置并破坏顺序保证。