Как убедиться, что транзакция была зафиксирована до возврата запроса API?

#python-3.x #django

Вопрос:

Я использую django с ATOMIC_REQUESTS=True . Это работает нормально, но в некоторых случаях это вызывает у меня проблемы.

Например, у меня есть поток:

  1. Вызовите API, создайте базу данных идентификаторов объектов и верните ее идентификатор.
  2. Вызовите другой API, используя идентификатор из предыдущего шага, и создайте другой объект в БД.

Иногда шаг 2 завершается неудачно, потому что транзакция с шага 1 еще не совершена, и я получил сообщение об ошибке, что объект не существует.

Я не могу вручную вызвать transaction.commit() return Response() оператор before, так как я полагаюсь на ATOMIC_REQUESTS из окна.

Я могу добавить try, except к шагу 2, но код будет выглядеть некрасиво, потому что для этого потребуется вызвать sleep() на пару секунд, чем повторять попытку. Также мне нужно будет определить, сколько попыток у меня должно быть, что может привести к длительному времени отклика или даже к ошибке тайм-аута.

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

Кто-нибудь сталкивался с таким поведением?

Комментарии:

1. наиболее рекомендуемым решением является использование transaction.atomic(). Даже несмотря на то, что это большая работа.