HLC混合逻辑时钟如何解决分布式事务的Linearizability与Serializability问题?
分布式事务为何需要同步时钟?
先看一组时钟不一致的场景:
true time = 100ms node A local time = 100ms node B local time = 0ms
这种情况下会出现事务时序冲突:
transactionA arrive nodeA at (true time 100ms, A time 100ms, B time 0ms) transactionA commit by nodeA at (true time 110ms, A time 110ms, B time 10ms) nodeB gets transactionA replicated at (true time 111ms, A time 111ms, B time 11ms) BUT with timestamp (110ms) transactionB arrive nodeB at (true time 120ms, A time 120ms, B time 20ms) transactionB is commit by nodeB at (true time 130ms, A time 130ms, B time 30ms)
此时两个事务的提交时间出现矛盾:
transactionA commit time = 110ms (local of A) transactionB commit time = 30ms (local of B)
实际真实时间里transactionA先于transactionB完成,但因为节点B的本地时钟比A慢100ms,会被判定为transactionB先于transactionA处理。
HLC如何解决该问题?
我理解HLC(混合逻辑时钟)仅包含两个组件:物理时间和单调递增的计数器(ticks),冲突时先比较物理时间,再比较计数器,对应的比较逻辑代码如下:
@Override public int compareTo(HybridTimestamp other) { if (this.wallClockTime == other.wallClockTime) { return Integer.compare(this.ticks, other.ticks); } return Long.compare(this.wallClockTime, other.wallClockTime); }
按照这个逻辑,似乎还是会出现上述的时钟不一致问题——因为比较时优先看物理时间,那HLC到底是怎么解决这类问题的?
内容的提问来源于stack exchange,提问作者olaf
相关产品推荐
相关产品推荐

