【问题标题】:Django Unable to rollback with try-exception block for atomic transactionsDjango无法使用原子事务的try-exception块回滚
【发布时间】:2020-02-20 07:02:27
【问题描述】:

我在 Django 中的一个视图对 6-7 个表执行保存操作。我希望这些事务是原子的,例如,如果第 5 或第 6 个事务失败,我想回滚所有以前的保存。 该视图包含一个 try-except 块来处理引发的异常。

看起来像这样:

@transaction.atomic
def my_view(request):
    sid = transaction.savepoint()
    try:
        Table1.save()
        Table2.save()
        Table3.save()
        Table4.save()
        Table5.save()
        Table6.save()
        Table7.save()  # This might fail. In case of failure I want to rollback saves from Table1 to Table6

        transaction.savepoint_commit(sid)
    except Exception as e:
        print(str(e))
        transaction.savepoint_rollback(sid)
        return JsonResponse({"Status": 0, "Data": str(e)}) 

我已经尝试了上面的方法,Table7.save() 失败了,Table1 到 Table6 的回滚没有发生。 在所有情况下,我都想将 JSON 响应返回为 {"Status": 0, Data: "Error That occurred"}。 我不想像 This link 中所做的那样在 except 块中重新引发异常

如果失败,我应该怎么做才能返回正确的 JSONResponse 并回滚所有内容?

【问题讨论】:

  • Table2.save() 看起来不对,这是确切的代码还是只是为了总结问题?
  • 总结版本。您可以从 models.py 中导入任何模型(表作为类)并为该模型(表)保存记录。

标签: python django database django-models atomic


【解决方案1】:

正如link中所建议的那样:

transaction.atomic 将在数据库上执行一个事务,如果你 view 会产生没有错误的响应。因为你抓住了 自己例外,在 Django 看来,您的视图刚刚执行 美好的。如果捕获到异常,需要自己处理

另一种方法是在with 内使用transaction.atomic(作为上下文管理器),这将确保提交或回滚(再次在同一链接上建议并解释here

def my_view(request):
    try:
        with transaction.atomic():
            Table1.save()
            Table2.save()
            Table3.save()
            Table4.save()
            Table5.save()
            Table6.save()
            Table7.save()  # This might fail. In case of failure I want to rollback saves from Table1 to Table6

    except Exception as e:
        print(str(e))
        return JsonResponse({"Status": 0, "Data": str(e)}) 

【讨论】:

  • 我们自己使用transaction.savepoint()来处理。不过,我无法进行任何回滚。在“with”中使用 transaction.atomic 并捕获上述异常并没有帮助。那么如何使用 try-except 子句自己处理是我的问题。
  • @shreesh katti,答案很好。调试您的代码并确保您遇到了故障。例如,在Table7save()方法中运行异常并再次测试
猜你喜欢
  • 2016-04-16
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
  • 2016-06-25
相关资源
最近更新 更多