Хранилище данных: сохранение сущности с преемниками в одной транзакции с автоматически сгенерированными идентификаторами ключей - PullRequest
0 голосов
/ 11 октября 2018

Я хотел бы запустить следующий алгоритм (это больше похоже на псевдокод javascript)

const transaction = datastore.transaction(); 
await transaction.run();
const parentKey = createKey(namespace, kind) // note that I leave the ID th be generated
await transaction.save(ancestorKey, parentEntity); 
const childKey = createKey(namepsace, kind, parentId, parentKind) // ??? 
await transaction.save (ChildKey, childEntity); 
await transaction.commit(); 

Как узнать parentId, поскольку первоначальное сохранение parentEntity еще не зафиксировано?

Я бы хотел выполнить это в одной транзакции, это достижимо?

1 Ответ

0 голосов
/ 14 октября 2018

Нет, это невозможно из-за изолированности и согласованности транзакций хранилища данных (выделено мое):

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

В зависимости от того, почему на самом деле требуется такая последовательность операций для транзакций, вы могли бы иметь возможность достичь чего-то аналогичного:1017 *

  • создать родительскую транзакцию
  • в той же транзакции также создать и транзакционно поставить в очередь очередь принудительной задачи, передав ей ключ родителя в качестве параметра - задача будет поставлена ​​в очередьтолько если / когда транзакция завершится успешно
  • в обработчике задачи (также сделанном транзакционным) создайте дочернюю сущность - гарантированно произойдет только один раз

Обратите внимание, что не все среды GAE поддерживают такую ​​схемуиз-за ограниченной поддержки очереди задач push.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...