知识卡片
一致性定义的精确化:从"节点同时可见"到"客户端读到最新写入"
内容
承接[[CAP理论适用范围的精确化:互联且共享数据的读写系统]],一致性(Consistency)的定义也经历了从粗糙到精确的演变。第一版表述是”所有节点在同一时刻都能看到相同的数据”(All nodes see the same data at the same time),第二版改为”对某个指定客户端来说,读操作保证能返回最新的写操作结果”(A read is guaranteed to return the most recent write for a given client)。两版差异体现在三个层面:一是视角从”节点”转向”客户端”——第二版站在客户端观察系统行为的角度描述,更贴近我们实际评估一个系统的方式;二是关键词从”see”换成”read”——严格说节点是”拥有”(have)数据而不是”看到”(see)数据,”see”这个词本身用词就不够准确,第二版改用客户端的”读”操作来定义一致性反而更精确;三是第一版强调”同一时刻拥有相同数据”(same time + same data),第二版完全没有强调这一点,这意味着实际上节点之间完全可能出现”同一时刻数据不同”的情况——这一点乍看和我们通常理解的”一致性”有出入,但原因在第一版更详细的解释里其实已经埋下伏笔:一个系统在事务开始时是一致状态,事务结束时也应回到一致状态,但事务执行过程中系统是可以(也确实会)短暂进入不一致状态的,只要出错就整体回滚即可。换句话说,事务执行期间不同节点的数据本来就可能暂时不一致,这恰恰说明第一版”所有节点同一时刻数据相同”这个表述是不严谨的;而第二版只强调客户端的读操作要拿到最新写入结果就完全站得住脚——因为事务执行期间客户端本来就读不到未提交的数据,只有事务真正提交后客户端才能读到写入结果,事务失败则会回滚、客户端同样不会读到中间状态的脏数据。