Уровень изоляции транзакций в Django ORM

Можно ли установить уровень изоляции для пользовательской транзакции (но не с raw sql)?

Например, что-то вроде:

with transaction.commit_on_success(isolation='SERIALIZABLE'):
    bla

Ответ 1

Насколько я знаю, нет способа временно изменить уровень изоляции транзакций в Django для существующего соединения (ов) базы данных.

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

например. в вашем settings.py:

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,
        },
    },
}

Чтобы использовать сериализуемый уровень транзакций, вы можете:

  • Используйте метод using() QuerySet например User.objects.using('serializable').all
  • Добавьте настраиваемый менеджер, который указывает соединение с базой данных с уровнем изоляции транзакции

    class SerializableUserManager(models.Manager):
        def get_queryset(self):
            return super(SerializableUserManager, self).get_queryset().using('serializable')