Я создаю REST API в Django, где пользователи могут запускать задачи для объектов. Ниже я создал простой пример, в котором я использую транзакции для простого отката состояния объекта в случае сбоя задачи.
from django.db import IntegrityError, transaction
def send_object(id):
obj = MyModel.objects.get(pk=id)
if obj.state != 'Created':
raise ValueError('Object not in state "Created"')
with transaction.atomic():
obj.state = 'Sending'
obj.save()
# send the object...
obj.state = 'Sent'
obj.save()
Теперь я хочу, чтобы состояние объекта было видно пользователям через API во время выполнения задачи. Поскольку транзакция не подтверждена до выполнения задачи, пользователи видят только текущее состояние до и после задачи.
Мне нужна какая-то транзакция в случае сбоя системы / завершения работы во время выполнения задачи, и объект застревает при «Отправке». Состояние должно быть сброшено, чтобы можно было легко повторить задачу.
Уровень изоляции установлен на READ COMMITTED
и не может быть изменен без обновления других частей кода.
Могу ли я сделать новое состояние доступным до того, как транзакция будет зафиксирована (т.е. разрешить грязное чтение) только для этой транзакции? Или я могу что-то еще сделать?