2014-12-07 74 views
10

我想我的Django視圖是原子的。我的意思是,如果在視圖中有2個DB寫入,我想要寫入0或2個寫入。Django原子請求如何工作?

例如:

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

+0

您在哪裏設置了「ATOMIC_REQUESTS」值?什麼是AUTOCOMMIT值? – koxt 2014-12-07 18:31:48

回答

27

ATOMIC_REQUESTS是一個數據庫連接設置的屬性字典,不是頂層設置。因此,例如:

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