Исключение транзакции в Google Datastore - PullRequest
0 голосов
/ 22 февраля 2020

Как отмечено в документации Google Datastore:

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

В дополнение к обновлению сущности в транзакции, я также добавляю задачи pu sh в очередь pu sh. Если транзакция выдает исключение, но действительно была успешно зафиксирована, означает ли это, что задачи очереди pu sh были успешно поставлены в очередь?

Ответы [ 2 ]

1 голос
/ 29 февраля 2020

Из цитаты в посте gso_gabriel ответ, кажется, да.

Однако у меня есть некоторые сомнения. Как представляется, постановка в очередь транзакционной задачи является функцией клиентской библиотеки хранилища данных (ndb / ваша java библиотека) - я не помню, чтобы она была задокументирована как универсальная c база данных (т. Е. На стороне сервера).

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

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

  • если важно правильно и своевременно ставить задачу в очередь даже в этих неблагоприятных условиях, вы можете попытаться использовать именование задачи в качестве средства постановки задачи в идемпотентное состояние: даже если исключение может Не указывайте, была ли задача поставлена ​​в правильном порядке или повторная попытка не повредит, поскольку вы не можете (на некоторое время) поставить в очередь именованную задачу дважды. Однако вам потребуется способ генерирования уникальных имен задач.

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

  • , если сроки выполнения задачи не так важны, может быть возможно иметь дело со всей этой историей в по-другому. Например, у меня уже были некоторые периодические c высокоуровневые задания проверки целостности в поисках осиротевших предметов (независимо от причин их существования). В моем случае эффект от постановки пропущенного задания был лишь одним из способов создания такого объекта-сироты. Поскольку время не имело решающего значения, и шансы встретить такие события невелики, было приемлемо не беспокоиться о них, не усложнять ситуацию и оставить восстановление (повторное выполнение постановки задачи) этим заданиям проверки целостности.
1 голос
/ 25 февраля 2020

Если транзакция действительно была успешной - даже если она столкнулась с исключениями - задачи очереди pu sh также должны быть правильно поставлены в очередь.

Согласно документации, которую вы упомянули здесь, он говорит:

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

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

Дайте мне знать, если информация

...