На механизме приложения Google, как я реализую транзакции базы данных?

Я знаю, что способ обработать DB transactionality на механизме приложения состоит в том, чтобы дать различным объектам то же Parent(Группа объекта) и использовать db.run_in_transaction.

Однако предположите, что я не могу дать двум объектам того же родителя. Как я удостоверяюсь, чтобы мои обновления DB произошли в транзакции?

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

Примечание: Я использую Python.

5
задан David Underhill 21 July 2010 в 20:41
поделиться

4 ответа

До тех пор, пока предприятия принадлежат к одной и той же Группе, это не является вопросом. Из docs:

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

Есть также хорошая статья об Изоляции транзакций в App Engine.

EDIT: Если вам нужно обновить сущности с разными родителями в одной и той же транзакции, вам нужно будет реализовать способ сериализации изменений, которые были сделаны самим собой и откат вручную, если поднято исключение.

.
5
ответ дан 13 December 2019 в 05:36
поделиться

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

Статья Изоляция транзакций в AppEngine объясняет это более подробно.

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

Для получения дополнительной информации о группах сущностей и модели хранилища данных, смотрите Как хранятся сущности и индексы.

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

.
2
ответ дан 13 December 2019 в 05:36
поделиться

Одна из возможностей - это реализовать обработку ваших собственных транзакций, как вы уже упоминали. Если вы подумываете о том, чтобы сделать это, то вам стоит изучить предыдущую работу над этой проблемой.

http://danielwilkerson.com/dist-trans-gae.html

Дэн Уилкерсон также рассказал об этом в Google IO. Вы должны найти видео разговора.

2
ответ дан 13 December 2019 в 05:36
поделиться

Если вам нужны межгрупповые транзакции, вам придется реализовать их самостоятельно, или подождать, пока библиотека их выполнит. Некоторое время назад я написал статью о том, как реализовать межстандартные транзакции в случае "банковского перевода"; она может быть применима и к вашему случаю использования.

3
ответ дан 13 December 2019 в 05:36
поделиться