Django - 引发异常时不会发生回滚

问题描述 投票:0回答:2

设置.py

DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'diva',
    'USER': 'root',
    'PASSWORD': 'admin',
    'ATOMIC_REQUESTS':True,
    'HOST': 'localhost',
    'PORT': '3306',
},

}

views.py

def create_project(self, request):
    try:
        with transaction.atomic():
               code here
    except Exception as e:
        print "Exception--->",str(e)
        response = {"status":"failed",'response': ugettext("projects.services.create_project.failure")}
        stat = status.HTTP_400_BAD_REQUEST
        return Response(response, status=stat)

在我的代码中,如果它引发 ObjectDoesNotExist 异常回滚未发生,任何人都可以用示例解释事务在 django 中如何工作。

python django transactions atomic django-database
2个回答
5
投票

这是正确的。如果发生异常,django 的行为将回滚事务,但该异常必须是 DatabaseError 或其子类之一(最显着的是 IntegrityError)

ObjectDoesNotExist
不是DatabaseError的子类,因此没有理由回滚此事务。

最后但并非最不重要的一点。不要捕获

Exception
始终捕获您正在寻找的特定异常。


0
投票

如果配置了多个数据库,您可能需要通过

using
参数指定要使用的数据库。默认情况下它使用“默认”数据库

with transaction.atomic(using="custom-db"):
    # your logic that raises error

https://docs.djangoproject.com/en/1.8/topics/db/transactions/#django.db.transaction.atomic

© www.soinside.com 2019 - 2024. All rights reserved.