比可串行化更严的:外部一致性
可串行化只要求等价于某个串行顺序,不管现实时间。
于是可能出现这种情况:你转完账,看到「成功」,打电话让朋友查,朋友查到的还是旧余额。数据库说「我把他的事务排在你前面了」,这也满足可串行化。
外部一致性(也叫严格可串行化)多了一条要求:T1 在现实中已经提交,之后 T2 才开始,那等价顺序里 T2 必须排在 T1 后面。
单机上这很容易:一个时钟、一个锁管理器,提交顺序天然就是真实顺序。
难在分布式:各节点的时钟有偏差,后开始的事务可能拿到更早的时间戳。Google Spanner 的做法是 TrueTime:用 GPS 和原子钟给出「误差不超过 ε」的时间区间,提交前先等过这段误差再宣布成功(commit wait),用一点延迟换来正确。