Я знаю, что способ обработать DB transactionality на механизме приложения состоит в том, чтобы дать различным объектам то же Parent
(Группа объекта) и использовать db.run_in_transaction
.
Однако предположите, что я не могу дать двум объектам того же родителя. Как я удостоверяюсь, чтобы мои обновления DB произошли в транзакции?
Существует ли техническое решение? В противном случае существует ли шаблон, который я могу применить?
Примечание: Я использую Python.
До тех пор, пока предприятия принадлежат к одной и той же Группе, это не является вопросом. Из docs:
Все операции по хранению данных в операции должны осуществляться с организациями в одной и той же группе. Данный сайт включает в себя запрос сущностей по прародитель, извлекающий сущности по ключу, обновление организаций и удаление сущности. Обратите внимание, что каждая корневая сущность принадлежит к отдельной группе субъектов, поэтому единственная транзакция не может создать или оперировать более чем одним корневым существом. Для объяснения групп сущностей, смотрите Ключи и группы сущностей.
Есть также хорошая статья об Изоляции транзакций в App Engine.
EDIT: Если вам нужно обновить сущности с разными родителями в одной и той же транзакции, вам нужно будет реализовать способ сериализации изменений, которые были сделаны самим собой и откат вручную, если поднято исключение.
.Транзакции в хранилище данных AppEngine действуют по-другому, чем те, к которым вы могли бы привыкнуть в базе данных SQL. Во-первых, транзакция на самом деле не блокирует сущности, с которыми она работает.
Статья Изоляция транзакций в AppEngine объясняет это более подробно.
Из-за этого вы захотите по-другому подумать о транзакциях - вероятно, вы обнаружите, что в большинстве случаев, когда вы хотите использовать транзакцию, она либо лишняя, либо не достигнет того, что вы хотите.
Для получения дополнительной информации о группах сущностей и модели хранилища данных, смотрите Как хранятся сущности и индексы.
Обработка ошибок в хранилище данных рассказывает о том, что может привести к тому, что транзакция не будет зафиксирована, и как с этим справиться.
.Одна из возможностей - это реализовать обработку ваших собственных транзакций, как вы уже упоминали. Если вы подумываете о том, чтобы сделать это, то вам стоит изучить предыдущую работу над этой проблемой.
http://danielwilkerson.com/dist-trans-gae.html
Дэн Уилкерсон также рассказал об этом в Google IO. Вы должны найти видео разговора.
Если вам нужны межгрупповые транзакции, вам придется реализовать их самостоятельно, или подождать, пока библиотека их выполнит. Некоторое время назад я написал статью о том, как реализовать межстандартные транзакции в случае "банковского перевода"; она может быть применима и к вашему случаю использования.