我有一个名为 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 时,这也发生了两次。)我怎样才能阻止这种情况发生,或者检查它是否发生了?