Google Datastore - запрос предка не выглядит строго согласованным, если объект не существует - PullRequest
0 голосов
/ 16 января 2020

Предположим, у вас есть такой метод:

Entity entity = ofy().load().type(Entity.class)
        .ancestor(key)
        .filter("someField", someValue)
        .first().now();

if (entity == null) {
    // Entity does not exist yet.
    // Write new entity to Datastore.
}

Метод проверяет, существует ли определенная сущность с помощью запроса предка. Если этого не происходит, он записывает его в хранилище данных.

Одна вещь, которую я обнаружил, состоит в том, что, если описанный выше метод выполняется дважды в одно и то же время, то записываются две сущности. Похоже, что entity по-прежнему считается нулевым из-за состояния гонки.

Я думал, что запросы предков должны быть строго согласованными и, таким образом, предотвращать приведенный выше сценарий? Похоже, что он не является строго согласованным, когда сущность не существует.

Есть ли способ предотвратить запись двух сущностей в приведенном выше случае?

1 Ответ

3 голосов
/ 16 января 2020

Я могу ошибаться, но из-за того, как вы сформулировали вопрос, похоже, что вы путаете "строго в соответствии" с "atomi c". Строго согласованное чтение гарантированно отражает все обновления, которые были до него, но также устарело в тот момент, когда вы его выполняете - кто-то другой мог перезаписать данные через одну микросекунду позже.

Единственный способ предотвратить состояние гонки в хранилище данных должно использовать транзакции. В интернете достаточно документации, поэтому я не буду здесь ее описывать.

...