Django Transaction无效

时间:2016-03-25 08:26:24

标签: python django transactions

我希望在视图引发异常时回滚事务。

我尝试按照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

2 个答案:

答案 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在事务中包装。