其实数据库时间戳的问题并不复杂,但是又很多的朋友都不太了解数据库时间戳,因此呢,今天小编就来为大家分享数据库时间戳的一些知识,希望可以帮助到大家,接下来我们一起来看看这个问题的分析吧!

逻辑时钟的原理是非常简单的,但是它没有实际的物理时间概念,所以如果想根据真实时间来查询相关事件,就办不到了。
CockroachDB蟑螂数据库采用混合逻辑时钟HLC来解决这个问题。HLC由两部分组成,物理时钟和逻辑时钟。l.j维护的是节点j当前已知的最大的物理时间,c.j则是当前的逻辑时间。那么判断两个事件的先后顺序就很容易了,先判断物理时间,再判断逻辑时间。HLC的算法如下,在节点j上面:初始化: l.j = 0,c.j = 0。给另一个进程发送或者处理自己的事件流程如下:
当CockroachDB开始事务时,它基于当前节点选取时间戳t,同时保有最大时钟偏移t+offset。当事务从不同节点读取数据时,只要没有碰到在该时间戳和最大时钟偏移内发生键值冲突的事务,就都很容易处理。因此这个最大偏移内的时间窗口内事务拥有冲突不确定性。当冲突发生时,事务需要重启,但重启后事务依据逻辑时间戳设置,而最大偏移t+offset值在事务重启后也保持不变,因此不确定的时间窗口会缩短,从多个节点读取键值的事务可能需要多次重启。跟Spanner相比,CockroachDB是在读取之前等待,而Spanner是在写入之后等待,并且Spanner等待很短的时间,而CockroachDB则可能在读取之前等待较长时间。HLC毕竟是基于NTP的,所以如果NTP出现了问题,会导致HLC与当前系统物理时间的误差过大,从而影响CockroachDB的响应延迟。
CockroachDB也提供命令行参数(--linearizable)来提供跟Spanner类似的等待机制实现Linearizability,对于采用NTP协议同步时间的硬件来说,这样做开销很大。未来如果Google开源其原子钟的硬件方案,也许可以造福众公司。
事务和时间戳的关系本号以前略有提及,比如原文链接,还有AtlasDB介绍等。更进一步的介绍未来再继续。
好了,文章到此结束,希望可以帮助到大家。