作者回复: 回答的很好,说明那个知识掌握的很扎实,点赞。关于这道思考题,我在15讲还留了一个彩蛋,可以关注下^Q^。 拼写确实错了,谢谢指出,已经请编辑同学帮忙调整了。
作者回复: 这个问题本质上是读写操作落入了一个时间置信区间,无法判断是否该读取已写入的数据。写等待是在写入时处理掉这个误差,读取时不再处理;而读等待则相反。
作者回复: 一个最直接的理由就是数据库要支持时点快照查询。比如,在可重复读隔离级别下,在事务执行过程中任何两个时点,对目标表执行同样的SQL应该得到同样的结果,当然前提是事务本身没有修改目标表。
作者回复: 只有读写操作的间隔在全局时钟的误差范围内,才会引发等待。如果采用写等待方式,数据库就不会对读操作再做检验,反之亦然。
作者回复: 写等待是要确保一个写事务中所有持久化的数据在一条正确的时间线上,也就是保证它们的先后次序是无误的。在任何一点的读操作都不会影响这个处理过程
作者回复: 你的理解大体上是对的,第一个等待是因为所有参与者各自取写入时间戳,注意不是提交;而提交时间戳要确保大于任何一个写入时间戳。
作者回复: 没有写等待时,Ta写盘先于Tb发生,所以Tb有可能读到Ta写的数据,这点你可以再思考一下。这个有可能就是时钟误差的不确定性,它影响了数据一致性。而写等待带来了一个确定性的结果,保证了数据一致性。
作者回复: 4ms是Google官方给出的TrueTime的误差均值。后面的计算也都是基于均值的。