检测扳手读取时间戳何时过期



我正在尝试在扳手数据集之上构建一个基于游标的分页API。为此,我使用初始请求中的读取时间戳来检索数据,然后将其编码到游标中,然后可用于在后续分页请求中进行"完全过时"(https://cloud.google.com/spanner/docs/timestamp-bounds)读取。

例如,处理第一页的请求如下所示:

Transaction tx = spanner.singleUseReadOnlyTransaction();
tx.executeQuery(statement); // result set containing the first page of data
tx.getReadTimestamp(); // read timestamp that gets returned in a cursor

对于后续请求:

Transaction tx = spanner.singleUseReadOnlyTransaction(TimestampBound.ofReadTimestamp(cursorTs));

我还想在光标时间戳过期时向用户返回一条消息(链接到上述的文档指出它们的有效期约为一个小时),为此,我有以下代码:

try {
// process spanner result set
} catch (SpannerException e) {
if (ErrorCode.FAILED_PRECONDITION.equals(e.getErrorCode)) {
// cursor has expired, return appropriate error message
}
}

当针对长时间运行的扳手数据库进行手动测试时,这工作正常。但是,在我的测试代码中,我创建了一个扳手数据库,然后在测试完成后将其拆除,在这些测试中,扳手异常仅在我使用绝对应该过期的读取时间戳时间歇性地抛出(例如超过一年)。在没有抛出异常的情况下,我得到一个空的结果集。如果我使用这个过期的读取时间戳在测试中多次请求扳手,最终数据库似乎始终抛出"失败的前提条件"错误。

对于新预配的扳手数据库,是否应出现此行为?

我相信这种行为的原因是因为您使用的是只读事务。如文档中所述,只读事务始终在选定点观察数据库和事务提交历史记录的一致状态。在您的情况下,将在测试完成之前和之后创建并拆除数据库。因此,除非经过多次尝试,否则不会观察到任何事务提交历史记录。

最新更新