Вопрос

в моем приложении Google App всякий раз, когда пользователь покупает несколько контрактов, выполняются эти события (упрощенные для наглядности).:

  • пользователь. денежные средства уменьшаются
  • user.contracts увеличивается на количество
  • contracts.current_price обновлена.
  • market.no_of_transactions увеличивается на 1.

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

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

Редактировать:Я, очевидно, пропустил группы сущностей.Теперь я был бы признателен за дополнительную информацию о том, как они используются.Еще один момент, который следует прояснить, заключается в том, что Google говорит: "Используйте группы сущностей только тогда, когда они необходимы для транзакций.Для других связей между сущностями используйте свойства ReferenceProperty и значения ключей, которые можно использовать в запросах".означает ли это, что я должен определить как ссылочное свойство (поскольку мне нужно запрашивать их), так и отношение родитель-потомок (для транзакций)?

правка 2:и, наконец, как мне определить двух родителей для объекта, если объект создается для установления отношения n-to-n между 2 родителями?

Это было полезно?

Решение

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

Другие советы

Позвольте мне добавить цитату из Документация хранилища данных:

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

Вы могли бы создать псевдокорневую сущность и поместить все ниже этого.Затем вы выполняете все в транзакции.

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

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

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

в ответ на ваши вопросы:1) вы не обязаны использовать как ссылочные свойства, так и отношения родитель / потомок (т. Е. группы сущностей).это руководство просто означает, что группы сущностей ограничивают пропускную способность записи в хранилище данных, поскольку записи сериализуются для каждой группы сущностей.вы должны знать об этом, если рассматриваете возможность структурирования ваших данных в группы сущностей только для запросов-предков.

2) у объекта не может быть более одного родителя.если вы хотите смоделировать отношения "многие ко многим", вам обычно следует использовать свойство ListProperty ссылочных свойств (то есть ключей).видишь эта статья и этот разговор для получения подробной информации.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top