Атомарные транзакции базы данных в 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