Включить грязное чтение для одной транзакции в Django - PullRequest
0 голосов
/ 05 июля 2018

Я создаю 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 и не может быть изменен без обновления других частей кода.

Могу ли я сделать новое состояние доступным до того, как транзакция будет зафиксирована (т.е. разрешить грязное чтение) только для этой транзакции? Или я могу что-то еще сделать?

1 Ответ

0 голосов
/ 05 июля 2018

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

Следующий код взят из связанного ответа:

DATABASES = {
    'default': {
        'NAME': 'app_data',
        'ENGINE': 'django.db.backends.postgresql',
        'USER': 'postgres_user',
        'PASSWORD': 's3krit',
    },
    'serializable': {
        'NAME': 'app_data',
        'ENGINE': 'django.db.backends.postgresl',
        'USER': 'postgres_user',
        'PASSWORD': 's3krit',
        'OPTIONS': {
            'isolation_level': psycopg2.extensions.ISOLATION_LEVEL_SERIALIZABLE,
        },
    },
}

Вы можете изменить его в соответствии со своими потребностями (возможно, используйте READ UNCOMMITED вместо SERIALIZABLE), а затем сообщите нам, решит ли это вашу проблему.

...