在 Google Spanner 中,是否有可能在已经观察到之后再次出现完全相同的提交时间戳

In Google Spanner, is it possible that the exact same commit timestamp can appear again after already observed

在 Google Spanner 中,提交时间戳由服务器生成并基于 "TrueTime",如 https://cloud.google.com/spanner/docs/commit-timestamp 中所述。 This page also states that timestamps are not guarnateed to be unique,因此多个独立的作者可以生成完全相同的时间戳。

在一致性保证的文档中,指出In addition if one transaction completes before another transaction starts to commit, the system guarantees that clients can never see a state that includes the effect of the second transaction but not the first.

我想了解的是

的组合
  1. 多个并发事务提交 "at the same time" 导致相同的提交时间戳(其中提交时间戳构成 table 键的一部分)
  2. A reader 观察到上面输入的新行 table

在这些情况下,reader 是否有可能观察到一些但不是所有将(最终)以完全相同的时间戳存储的行?或者换句话说,如果搜索直到已知确切时间戳的所有行,并且使用该时间戳插入行,查询是否可能首先 returns 一些结果,但再次执行时 returns更多?

这里的上下文是尝试以仅追加的方式对按时间排序的事件流进行建模——我需要能够将游标有效地保留到特定时间点(流中的点事件),并且需要知道在时间 T 观察到事件是否意味着您永远无法在恰好时间 T 再次获得更多事件。

Spanner 是外部一致的,这意味着任何 reader 将只能读取已完成事务的结果...

与所有外部一致的 DB 一起,不可能 事务外的 reader 能够读取另一个事务的 'pending state'交易。因此,时间 T 的 reader 只能看到时间 T 之前 提交的事务。

提交时间 T 的多个同时 insert/update 事务(这会影响不同的行,否则它们不能同时发生)在时间 T 不会被 reader 看到,但两者都是在 T+1

被 reader 看到

I ... need to know whether or not having observed events at time T means you can never get more events again at exactly time T.

是的。稍微改写一下,因为这是细微差别:
读取时间 T 之前(包括时间)的事件意味着您将永远不会再看到时间等于或早于时间 T

的事件

但请记住,提交时间戳列是一个简单的 TIMESTAMP 列,其中可以存储 任何 值——应用程序请求存储的值是提交时间戳,并且在数据库级别没有任何东西可以阻止应用程序存储它喜欢的任何值...

与 Spanner 一样,应用程序必须 enforce/maintain 数据完整性。