Как работают атомарные запросы Django?

Я бы хотел, чтобы мои представления Django были атомарными. Я имею в виду, если в представлении есть 2 записи БД, я хочу либо 0 записей, либо 2 записи.

Например:

def test_view(request):
    ''' A test view from views.py '''

    MyClass.objects.create()
    raise Exception("whatever")
    MyClass.objects.create()

То, что я нашел в документации, казалось многообещающим:

Обычный способ обработки транзакций в Интернете — оборачивать каждый запрос в транзакцию. Установите для ATOMIC_REQUESTS значение True в конфигурации каждой базы данных, для которой вы хотите включить это поведение.

Это работает так. Перед вызовом функции представления Django запускает транзакцию. Если ответ получен без проблем, Django фиксирует транзакцию. Если представление создает исключение, Django откатывает транзакцию.

Однако, даже если я установил ATOMIC_REQUESTS = True, при вызове test_view() создается первый объект MyClass! Что мне не хватает?

Примечание. Я использую Django 1.7.


person David D.    schedule 07.12.2014    source источник
comment
Где вы установили значение ATOMIC_REQUESTS? Что такое AUTOCOMMIT значение?   -  person koxt    schedule 07.12.2014


Ответы (1)


ATOMIC_REQUESTS — это атрибут dict настроек подключения к базе данных, а не настроек верхнего уровня. Так, например:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'mydatabase',
        'USER': 'mydatabaseuser',
        'PASSWORD': 'mypassword',
        'HOST': '127.0.0.1',
        'PORT': '5432',
        'ATOMIC_REQUESTS': True,
    }
}
person Daniel Roseman    schedule 07.12.2014