Блокируются ли группы сущностей Google App Engine, когда запись не выполняется в транзакции
У меня есть приложение "вопрос-ответ-комментарий" (похожее на stackru). Вопросы и связанные с ними ответы и комментарии логически составляют часть групп сущностей, как определено в Документах App Engine.
Я хочу использовать группы сущностей / пути к предкам для группировки своих сущностей по двум причинам:
- Повышение эффективности запросов за счет физического хранения сущностей вопросов и ответов вместе
- Позвольте мне выполнять запросы предков, что избавляет меня от необходимости хранить ключи ответа в сущности вопроса (отношениях)
Я не хочу сильной последовательности, поскольку это в конечном итоге вызовет разногласия.
Всегда ли App Engine блокирует группу сущностей при обновлении или только тогда, когда обновление выполняется в транзакции? Другими словами, группы сущностей принудительно обновляют транзакции или просто предоставляют возможность использовать транзакции?
1 ответ
Что касается вашей 1-й причины выбора подхода, основанного на предках - я не думаю, что когда-либо видел какие-либо обещания в отношении физического местоположения в хранилище данных - я полагаю, что любое такое ограничение будет противоречить его высокой масштабируемости. Я бы не стал беспокоиться об этом, ИМХО выигрыш от такой оптимизации эффективности, если таковой будет, будет незначительным.
Вы должны знать, что разногласия напрямую не связаны с (сильной) согласованностью (согласованность на самом деле сводится только к точности результатов запроса).
Однако конкуренция напрямую связана с одновременным доступом к одной и той же группе сущностей, даже для операций чтения, а не только для записи - см. Проблемы конкуренции в Google App Engine. Использование предков только усугубляет ситуацию, поскольку все объекты в дереве предков находятся в одной группе объектов.
По вашей второй причине (если я правильно понимаю вашу цель) вам не нужно хранить ключи ответа в своей сущности вопроса или использовать родословную. Если вы сохраняете ключ вопроса (или идентификатор ключа) в сущности ответа, вы можете получить ответы на вопрос, выполняя регулярные (не предковые) запросы для сущностей ответа с соответствующим ключом / идентификатором вопроса.
"Блокировка" группы сущностей видна только в транзакциях (и нет, транзакции не применяются, но дважды подумайте, прежде чем пытаться писать внешние транзакции - произойдет непреднамеренная перезапись). Но обратите внимание, что такая блокировка эффективна только как защита от конфликтующих операций записи, но не от конфликтов.