我希望在视图引发异常时回滚事务。
我尝试按照Django Doc
上的步骤操作但它似乎不起作用。
这是我的代码:
models.py
class Cargo(models.Model):
serial_number = models.CharField()
name = models.CharField()
views.py
从django.http导入JsonResponse 来自.models进口货物
def test(request):
cargo = Cargo(serial_number='123456', name='cargo')
cargo.save()
raise Exception()
return JsonResponse({'message': 'ok'})
我已在 settings.py 中打开ATOMIC_REQUESTS
。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'TABLE',
'USER': 'USER',
'PASSWORD': 'PASSWORD',
'HOST': '127.0.0.1',
'PORT': '1234',
'ATOMIC_REQUESTS': True,
}
}
但每次我访问test
视图时,它都会引发异常并仍在我的数据库中添加“货物”行。
我想知道如何启用Django Transaction。
谢谢!
还有一个问题,如果我使用Doc中描述的atomic
,就像:
views.py
from django.http import JsonResponse
from django.db import transaction
from .models import Cargo
@transaction.atomic
def test(request):
cargo = Cargo(serial_number='123456', name='cargo')
cargo.save()
raise Exception()
return JsonResponse({'message': 'ok'})
仍然需要'ATOMIC_REQUESTS': True
。
答案 0 :(得分:1)
我现在知道为什么。
因为我的数据库引擎是MyISAM,所以这就是交易不起作用的原因。
人们使用Transaction必须注意,如果DB支持它!
参考:https://docs.djangoproject.com/en/1.8/topics/db/transactions/#savepoints
答案 1 :(得分:0)
好吧,我可能不会告诉你任何你从文档中得知的新内容,但默认情况下,django视图在自动提交模式下工作,因此每个查询都会立即保存到数据库中。如果设置'ATOMIC_REQUESTS': True
,则无需使用@transaction.atomic
,因为每个视图都已使用ATOMIC_REQUESTS在事务中包装。