GAE объективирует объект загрузки, созданный в транзакции в рамках той же транзакции

#java #google-app-engine #transactions #objectify

#java #google-app-engine #транзакции #объективировать

Вопрос:

Я пытаюсь использовать objectify transaction, но у меня возникают некоторые проблемы, когда мне нужно перезагрузить объект, созданный в той же транзакции.

Возьмите этот пример кода

 @Entity
public class MyObject
{
    @Parent
    Key<ParentClass> parent;

    @Index
    String foo;
}


ofy().transact(new VoidWork()
{
    @Override
    public void vrun()
    {
        ParentClass parent = load();// load the parent
        String fooValue = "bar";

        Key<ParentClass> parentKey = Key.create(ParentClass.class, parent.getId())
        MyObject myObject = new MyObject(parentKey);
        myObject.setFoo(fooValue);

        ofy().save().entity(myObject).now();

        MyObject reloaded = ofy().load().type(MyObject.class).ancestor(parentKey).filter("foo", fooValue).first().now();

        if(reloaded == null)
        {
            throw new RuntimeException("error");
        }
    }
});
  

Мой перезагруженный объект всегда равен нулю, может быть, я что-то пропустил, но логически в транзакции я могу запросить объект, который был создан в той же транзакции?

Спасибо

Ответ №1:

Облачное хранилище данных отличается от реляционных баз данных в этом конкретном случае. В документации указано, что —

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

https://cloud.google.com/datastore/docs/concepts/transactions#isolation_and_consistency

Комментарии:

1. Спасибо за ответ, я надеюсь, что objectify обработает это с помощью локального кэша в контексте транзакции, но, очевидно, objectify этого не делает..

2. Если вы выполнили получение по ключу в транзакции, Objectify предоставит вам сохраненный вами объект (из кэша сеанса). Однако запросы отправляются в процессор запросов хранилища данных (нет способа удовлетворить запрос из кэша сеанса), и, таким образом, вы видите набор результатов null.

3. Это восходит к «думайте о хранилище данных как о хранилище ключ-значение с некоторым дополнительным поведением индексации». В поведении запроса есть некоторые особенности.