Транзакции Django: Как запустить дополнительный код во время отката? - PullRequest
0 голосов
/ 08 мая 2018

Представьте, что в вашем веб-приложении есть модель User, и вам необходимо синхронизировать этого пользователя с внешней службой через API. Таким образом, когда вы создаете пользователя локально, вам также необходимо создать его удаленно.

Все ваши операции выполняются в режиме transaction.atomic(), и вы пытаетесь сохранить все ваши сторонние вызовы API после атомарного блока, что является разумным.

Но, поскольку система является системой, ее сложность возрастает до тех пор, пока вам действительно не удастся удалить сторонние вызовы в вызове обновления.

Тем не менее, есть ли способ расширить механизм транзакций Django, добавив некоторые функции обратного вызова, такие как rollback.add_callback(clean_3rdparty_user(user_id=134))?

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

1 Ответ

0 голосов
/ 08 мая 2018

Автор кода ловушки транзакции Django имеет это, чтобы сказать о том, почему существует on_commit(), но не on_rollback():

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

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

try:
    with transaction.atomic():
        # Do database stuff
        # Do external stuff
except:
    # We know the database stuff has rolled back, so...
    # Undo external stuff
    raise

Это не особенно элегантно. Я согласен со следующим из того же источника:

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

Но, похоже, вы с этим уже согласны.

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