Django 交易无效

Django Transaction did not work

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

我试着按照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 视图时,它都会引发异常并仍然在我的数据库中添加一个 'cargo' 行。

我想知道如何启用 Django 事务。

谢谢!


还有一个问题,如果我使用 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还是有必要的。

我现在知道为什么了。

因为我的数据库引擎是 MyISAM,所以 Transaction 没有工作。

用Transaction的人一定要注意DB是否支持!

参考:https://docs.djangoproject.com/en/1.8/topics/db/transactions/#savepoints

好吧,我可能不会告诉你任何你从文档中不知道的新内容,但默认情况下,django 视图在自动提交模式下工作,因此每个查询都会立即保存到数据库中。如果您设置 'ATOMIC_REQUESTS': True,则无需使用 @transaction.atomic,因为每个视图都已通过使用 ATOMIC_REQUESTS.

包装在事务中