1

我有一个名为 lineItems 的数据存储实体,它由要开票的单个行项目组成。用户找到行项目并将采购订单编号附加到行项目。它们显示在可以创建发票的网页上。

我会显示获取实体的代码,但我认为这根本不重要,因为几个月前我使用托管 VM 时也发生过几次,代码完全不同。(我之前使用的是 objectify,现在我使用的是数据存储 API)。简而言之,我目前只使用 StructuredQuery.setFilter(new PropertyFilter.eq("POnum",ponum)).setFilter(new PropertyFilter.eq("Invoiced", false)); (这是伪代码,您不能像这样执行两个 .setFilters。真正的代码接受 PropertyFilters 列表并正确创建复合过滤器。)

今天早上发生的事情是管理员创建了发票,除了两行之外的所有行都在发票上。有两行代码从未获取,这些行被卡在“要创建的发票”部分。

管理员只是为给定的采购订单号再次创建了发票,但第二次它确实选择了剩余的两行并创建了第二张发票。

请注意,这些实体是在将近 24 小时前创建/编辑的(当她为它们分配采购订单编号时),所以它们在数据库中待了很长时间。(我检查了我的日志)。这不是刚刚创建它们,然后尝试在短时间内访问的情况。这也不是未能更新实体的情况 - 代码在第 3 方会计包中创建发票,而它们根本不存在。发票创建成功后,所有实体都将更新为“invoiced = true”并写入数据存储区。因此,会计程序中发票上没有的行是数据存储中未更新的行。(这也不是“智能”检查,它不会逐行检查。

据我所知,数据存储区第一次没有返回与查询匹配的所有实体,但第二次返回了。

大约有 40,000 个 lineItem 实体。

哪些条件会导致数据存储区抓取随机无法抓取所有符合 StructuredQuery 搜索参数的实体?(请注意,在现已弃用的托管 VM 架构上使用 Objectify 时,这也发生了两次。)我怎样才能阻止这种情况发生,或者检查它是否发生了?

4

1 回答 1

1

您可能会看到最终的一致性,因为您没有使用祖先查询。

请参阅:https ://cloud.google.com/datastore/docs/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore/

于 2017-07-27T22:23:19.710 回答