HLC混合逻辑时钟如何解决分布式事务中的线性化和串行化?

问题描述 投票:0回答:1

我对为什么分布式事务需要同步时钟的理解如下

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和transactionB之间的交易时间有冲突

transactionA commit time = 110ms (local of A)
transactionB commit time = 30ms (local of B)

事务 A 应该在事务 B 之前处理,但是由于节点 B 落后节点 A 100ms,所以现在认为事务 B 在事务 A 之前处理

HLC如何解决这个问题?根据我的理解,HLC只有两个组成部分,时间和单调增加的数字,当你有冲突时,你只需比较时间和数字,首先比较时间

  @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);
  }

所以你仍然会遇到同样的问题,因为首先比较时间?

database concurrency distributed-system google-cloud-spanner cockroachdb
1个回答
0
投票

将此作为社区维基共享以造福他人

正如@John Hanley 所提到的

您不能有两个互相影响的交易。启动事务会创建锁。启动另一个依赖事务必须等待先前的锁被释放。该功能对于所有 SQL 数据库都是通用的。您正在尝试创建几十年前已解决的场景。 cloud.google.com/spanner/docs/transactions#locking

如果两个事务不互相影响,那么什么时候提交并不重要。如果它们相互影响,您只能开始一项交易,另一项交易必须等待。你所创造的场景不可能发生。我很佩服你想深入了解Spanner,但首先你必须了解基本的SQL数据库设计。谷歌有非常好的基础知识文档,而且还有很多好书可供阅读。

© www.soinside.com 2019 - 2024. All rights reserved.