[英]Django Unable to rollback with try-exception block for atomic transactions
我在 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 的回滚。 在所有情况下{"Status": 0, Data: "Error That occurred"}
我都想将 JSON 响应返回为{"Status": 0, Data: "Error That occurred"}
。 我不想像在此链接中所做的那样在 except 块中重新引发异常
我应该怎么做才能返回正确的 JSONResponse 并在失败时回滚所有内容?
正如链接中所建议的:
如果您的视图产生一个没有错误的响应, transaction.atomic将在数据库上执行一个事务。 因为您自己捕获异常,所以在 Django 看来,您的视图执行得很好。 如果捕获异常,则需要自己处理
另一种方法是在内部使用transaction.atomic
with
(作为上下文管理器),这将确保提交或回滚(再次在同一链接上建议并在此处进行解释)
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)})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.