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

Google cloud platform 检测扳手读取时间戳何时过期,google-cloud-platform,google-cloud-spanner,Google Cloud Platform,Google Cloud Spanner,我试图在扳手数据集的顶部构建一个基于光标的分页API。要做到这一点,我将使用从初始请求中读取的时间戳来检索数据,然后将其编码到一个游标中,该游标可用于在后续分页请求中读取“精确的过时”(Exact stalence) 例如,对第一页请求的处理类似于: Transaction tx = spanner.singleUseReadOnlyTransaction(); tx.executeQuery(statement); // result set containing the first page

我试图在扳手数据集的顶部构建一个基于光标的分页API。要做到这一点,我将使用从初始请求中读取的时间戳来检索数据,然后将其编码到一个游标中,该游标可用于在后续分页请求中读取“精确的过时”(Exact stalence)

例如,对第一页请求的处理类似于:

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
    }
}
在对长时间运行的扳手数据库进行手动测试时,这种方法工作得很好。然而,在我的测试代码中,我创建了一个扳手数据库,然后在测试完成后将其拆下。在这些测试中,当我使用一个读取时间戳时,扳手异常只会间歇性地抛出,该时间戳肯定会过期(比如超过一年)。在没有抛出异常的情况下,我得到一个空的resultset。如果我在测试中使用这个过期的读取时间戳向span发出多个请求,那么最终数据库似乎总是抛出“失败的前提条件”错误


新配置的扳手数据库是否会出现这种行为?

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