2014-12-07 21 views
10

Chciałbym, aby moje widoki Django były atomowe. Mam na myśli, jeśli istnieje 2 zapisy DB w widoku, chcę albo 0 zapisu, albo 2 zapisy.Jak działają żądania atomowe Django?

Na przykład:

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

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

Co znalazłem w dokumentacji wydawało obiecująco:

Częstym sposobem obsługi transakcji w internecie jest owinąć każdą prośbę w transakcji. Ustaw ATOMIC_REQUESTS na wartość True w konfiguracji dla każdej bazy danych, dla której chcesz włączyć to zachowanie.

To działa tak. Przed wywołaniem funkcji widoku Django rozpoczyna transakcję . Jeśli odpowiedź zostanie wygenerowana bez problemów, transakcja zostanie zatwierdzona przez Django. Jeśli widok powoduje wyjątek, Django wycofuje transakcję.

Jednak nawet jeśli ustawić ATOMIC_REQUESTS = True, gdy dzwoni test_view(), pierwszy obiekt MojaKlasa jest tworzony! czego mi brakuje?

Uwaga: Używam Django 1.7

+0

Gdzie ustawiłeś wartość "ATOMIC_REQUESTS"? Co to jest wartość "AUTOCOMMIT"? – koxt

Odpowiedz

27

ATOMIC_REQUESTS jest atrybutem ustawieniach połączenia bazy danych DICT, a nie ustawienia najwyższego poziomu. Na przykład:

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