У меня есть объект хранилища данных под названием lineItems, который состоит из отдельных позиций, по которым должен быть выставлен счет. Пользователи находят позиции и прикрепляют к ним номер заказа на покупку. Они отображаются на веб-странице, где они могут создать счет-фактуру.
Я бы показал свой код для извлечения сущностей, но я не думаю, что это вообще имеет значение, так как это тоже происходило пару раз, когда я использовал управляемую виртуальную машину несколько месяцев назад, и код был совершенно другим. (Раньше я использовал objectify, теперь использую API хранилища данных). Вкратце, в настоящее время я просто использую StructuredQuery.setFilter (новый PropertyFilter.eq ("POnum", ponum)). SetFilter (new PropertyFilter.eq ("Invoiced", false)); (это псевдокод, вы не можете использовать два таких .setFilter. Настоящий код принимает список PropertyFilters и правильно создает составной фильтр.)
Этим утром произошло то, что администратор создал счет, и все, кроме двух строк, были в счете. Было две строки, которые код так и не получил, и эти строки застряли в разделе «счета для создания».
Администратор просто снова создал счет-фактуру для данного номера заказа на покупку, но во второй раз он ДЕЙСТВИТЕЛЬНО взял две оставшиеся строки и создал второй счет-фактуру.
Обратите внимание, что сущности были созданы / отредактированы почти 24 часа назад (когда она присвоила им номер заказа на поставку), поэтому они довольно долго сидели в базе данных. (Я проверил свои логи). Это не тот случай, когда они были только что созданы, а затем к ним попытались получить доступ в течение короткого периода времени. Это также НЕ случай неудачного обновления сущностей - код создает счет в стороннем бухгалтерском пакете, а их там просто не было. После успешного создания счета все объекты обновляются с помощью invoiced = true и записываются в хранилище данных. Таким образом, строки, которых не было в счете-фактуре в бухгалтерской программе, не были обновлены в хранилище данных. (Это тоже не «умная» проверка, она не проверяет построчно. Она просто проверяет, было ли создание счета-фактуры успешным или нет, а затем обновляет все сущности, которые у него есть в памяти).
Насколько я могу судить, хранилище данных просто не вернуло все объекты, которые соответствовали запросу в первый раз, но вернуло во второй раз.
Существует около 40 000 сущностей lineItem.
При каких условиях выборка из хранилища данных может случайно не захватить все объекты, которые соответствуют параметрам поиска StructuredQuery? (Обратите внимание, что это также произошло дважды при использовании Objectify на устаревшей управляемой архитектуре виртуальных машин.) Как я могу предотвратить это или проверить, произошло ли это?