我希望我的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
答案 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,
}
}