顺序保证
- 写入顺序
- 可序列化 某种序列顺序
- 序列顺序
顺序与因果
顺序有利于保证因果关系,如果一个系统服从因果关系所规定的顺序,我们说它是因果一致的。
因果顺序不是全序的
全序(total order)允许任意两个元素进⾏⽐较,所以如果有两个元素,你总是可以说出哪个更⼤,哪个更⼩。
线性一致性强于因果一致性
捕获因果关系
为了确定因果顺序,数据库需要知道应⽤读取了哪个版本的数据。这就是为什么在 图5-13 中,来⾃先前操作的版本号在写⼊时被传回到数据库的原因。在SSI 的冲突检测中会出现类似的想法,如“可序列化的快照隔离(SSI)”中所述:当事务要提交时,数据库将检查它所读取的数据版本是否仍然是最新的。为此,数据库跟踪哪些数据被哪些事务所读取。
序列号顺序
但还有⼀个更好的⽅法:我们可以使⽤序列号(sequence nunber)或时间戳(timestamp)来排序事件。时间戳不⼀定来⾃时钟(或物理时钟,存在许多问题,如 “不可靠时钟” 中所述)。它可以来⾃⼀个逻辑时钟(logical clock),这是⼀个⽤来⽣成标识操作的数字序列的算法,典型实现是使⽤⼀个每次操作⾃增的计数器。
非因果序列号生成器
兰伯特时间戳
光有时间戳排序还不够
乍看之下,似乎操作的全序关系⾜以解决这⼀问题(例如使⽤兰伯特时间戳):如果创建了两个具有相同⽤户名的帐户,选择时间戳较⼩的那个作为胜者(第⼀个抓到⽤户名的⼈),并让带有更⼤时间戳者失败。由于时间戳上有全序关系,所以这个⽐较总是可⾏的。