数据存储有时无法提取所有必需的实体,但第二次工作



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

我会显示用于获取实体的代码,但我认为这根本不重要,因为几个月前我使用托管 VM 时也发生了几次,代码完全不同。 (我以前使用对象化,现在我使用数据存储 API(。 简而言之,我目前只是使用StructuredQuery.setFilter(new PropertyFilter.eq("POnum",ponum((.setFilter(new PropertyFilter.eq("Invoiced",false((; (这是伪代码,你不能像这样做两个.setFilters。 实际代码接受属性筛选器列表并正确创建复合筛选器。

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

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

请注意,这些实体是在几乎 24 小时之前创建/编辑的(当她将采购订单号分配给它们时(,因此它们在数据库中放置了相当长的一段时间。(我检查了我的日志(。这不是刚刚创建它们,然后尝试在短时间内访问的情况。 这也不是无法更新实体的情况 - 代码在第三方会计包中创建发票,而它们根本不存在。 发票创建成功后,所有实体都将更新为"发票 = true"并写入数据存储。因此,会计程序中发票上没有的行是数据存储中未更新的行。 (这也不是"智能"检查,它不会逐行检查。 它只是检查发票创建是否成功,然后更新内存中的所有实体(。

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

。大约有 40'000 个行项目实体。

哪些条件可能导致数据存储提取随机无法获取满足结构化查询搜索参数的所有实体? (请注意,在现已弃用的托管 VM 体系结构上使用 Objectify 时,这种情况也发生了两次。我怎样才能阻止这种情况发生,或者检查它是否已经发生?

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

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

相关内容

  • 没有找到相关文章

最新更新