【问题标题】:Django - Rollback is not happening when exception raisedDjango - 引发异常时不会发生回滚
【发布时间】:2017-03-22 07:38:22
【问题描述】:

settings.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


    【解决方案1】:

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

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

    最后但并非最不重要。不要捕获 Exception 始终捕获您正在寻找的特定异常。

    【讨论】:

    • 哎哟!我很高兴我在被咬之前读到了这篇文章。任何人都知道,为什么 Django 在这种情况下坚持数据库更改?
    • 感谢您的解释@e4c5。如果我的代码中出现任何异常并且还能够从视图发送我自己的响应,我需要回滚整个事务。我怎样才能做到这一点?
    • 抱歉,我似乎错过了您的评论。在浏览一些旧答案时遇到了这个问题。你还需要帮助还是解决了?
    猜你喜欢
    • 1970-01-01
    • 2017-01-12
    • 2019-11-19
    • 2020-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多