2014-12-07 80 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, 
    } 
}