Атомарные транзакции базы данных в Django

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

@transaction.atomic
def create_user(request):
 ....

но тогда, в этом случае, мне придется использовать этот декоратор для всех API.

Я попробовал сделать это в settings.py:

DATABASES = {
           'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': 'blah',
            'USER': 'postgres',
            'PASSWORD': 'blah',
            'HOST': '0.0.0.0',
            'PORT': '5432',
            'ATOMIC_REQUESTS': True
}

Но добавление ATOMIC_REQUESTS, похоже, не работает в некоторых случаях. Есть ли способ, чтобы я мог применять атомарные транзакции для всех API?

Не совсем уверен, так ли это, но в документации объясняется, что вам нужно передать параметр 'using' этому декоратору, который является параметром базы данных, к которой применяется эта операция. так что вы можете попробовать следующее

DATABASES = {
     'default': {
           'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': 'blah',
            'USER': 'postgres',
            'PASSWORD': 'blah',
            'HOST': '0.0.0.0',
            'PORT': '5432',
            'ATOMIC_REQUESTS': True,
     },
}

тогда так:

@transaction.atomic(using='default')
def create_user(request):

Я также понял, что вы использовали psycopg2 в качестве движка. Изменения в Django 1.9:

из документации:

Бэкенд django.db.backends.postgresql называется django.db.backends.postgresql_psycopg2 в более старых выпусках. Для обратной совместимости, старое название все еще работает в новых версиях.

fyi

Вернуться на верх