Жестко удаленный объект по-прежнему отображается в консоли администратора AppEngine

Я использую Objectify в GAE для Java. Недавно возникла ситуация, когда я удалил объект с помощью ofy().delete(), который предполагал жесткое удаление объекта из хранилища данных.

Однако я все еще мог видеть этот необратимо удаленный объект в административной консоли AppEngine (средство просмотра хранилища данных). Когда я пытаюсь развернуть (отредактировать) этот объект, щелкнув столбец ID/Name, я получаю сообщение об ошибке «Этот объект не существует». Я все еще могу получить этот объект из хранилища данных, используя ofy().get().

Это потому, что индексы не обновляются?

Заранее спасибо!


person user_1357    schedule 19.10.2012    source источник


Ответы (1)


Вы видите непротиворечивый характер запросов в хранилище данных с высокой степенью репликации.

Вот хорошее место для начала чтения: https://developers.google.com/appengine/docs/java/datastore/structuring_for_strong_consistency

person stickfigure    schedule 19.10.2012
comment
Таким образом, единственный способ убедиться, что сущность не видна, — это удалить ее в транзакции? Тогда, если я запущу get() для этого объекта даже вне транзакции, я все равно увижу значение, верно? - person honzajde; 28.01.2013
comment
Получение по ключу имеет строгую согласованность независимо от того, находитесь ли вы в транзакции или нет, хотя единственный способ гарантировать состояние хранилища данных — это использовать транзакцию. С Objectify вы можете использовать Query.hybrid(true), который превратит ваш запрос в запрос только с ключами + пакетное получение. Ofy автоматически удалит записи, которые отображаются в результатах запроса, но на самом деле не существуют. - person stickfigure; 28.01.2013
comment
Ну, что ж, спасибо. Что касается возможной согласованности - если я сделаю put() - в конечном итоге согласованным, а затем внутри транзакции я вызову get() для того же ключа - гарантированно ли я получу то, что я вложил (я могу гарантировать, что с этим объектом не произошло никаких других записей)? Думаю теоретически нет. Существуют ли какие-либо практические ограничения (временные ограничения), которые могут дать мне какие-то гарантии (в процентах)? - person honzajde; 28.01.2013
comment
Я предполагаю, что Query.hybrid(true) выдает ошибку, когда не может преобразовать в «запрос по ключевому запросу». Обратите внимание (но связанное с темой): значения по умолчанию для objectify задокументированы в ObjectifyService.factory().begin(). - person honzajde; 28.01.2013
comment
В режиме по умолчанию Objectify находится в режиме согласованности STRONG, что означает, что любое чтение (Query или ofy.load().id()) считывает последнее значение, верно? В режиме согласованности EVENTUAL я полагаю, что ofy.load().id() считывает последнее значение, потому что он создает внутренний ключ. - person honzajde; 28.01.2013
comment
Все это подробно описано в документации Google, которую необходимо прочитать. Вкратце: запросы всегда слабо согласованы, получение по ключу строго согласовано, если вы явно не сделаете его EVENTUAL. Операции размещения/сохранения являются либо асинхронными, либо синхронными; говорить о постоянстве здесь не имеет смысла. Пожалуйста, прочитайте документы хранилища данных Google. - person stickfigure; 28.01.2013
comment
Ну, я бы не стал смешивать синхронизацию или асинхронность в этой теме. Я думаю, что это имеет мало общего с этим. Все мои вопросы связаны с этой опцией: DatastoreServiceConfig config = withReadPolicy(new ReadPolicy(Consistency.EVENTUAL)). Я думаю, вы неправильно поняли мои вопросы. Но это нормально, я должен искать ответы elswere: - С уважением, Спасибо за ваши огромные усилия! - person honzajde; 29.01.2013
comment
Политика чтения никак не влияет на запись. - person stickfigure; 29.01.2013