Django原子请求如何工作?

时间:2014-12-07 18:10:59

标签: python django atomic django-database

我希望我的Django视图是原子的。我的意思是,如果视图中有2个DB写入,我想要0写入,要么写入2个。

例如:

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

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

我在文档中发现的内容似乎很有希望:

  

处理Web上的事务的常用方法是包装每个请求   在交易中。在配置中将ATOMIC_REQUESTS设置为True   要为其启用此行为的每个数据库。

     

它的工作原理如下。在调用视图函数之前,Django启动了一个   交易。如果生成的响应没有问题,Django   提交交易。如果视图产生异常,Django   回滚交易。

但是,即使我设置ATOMIC_REQUESTS = True,在调用test_view()时,也会创建第一个MyClass对象!我错过了什么?

注意:我使用的是Django 1.7

1 个答案:

答案 0 :(得分:33)

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,
    }
}