我在 Django 中的视图之一对 6-7 个表执行保存操作。我希望这些事务是原子的,即如果第五个或第六个事务失败,我想回滚所有以前的保存。
该视图包含一个 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"}
在所有情况下。
我不想像中那样重新引发 except 块中的异常这个链接 https://stackoverflow.com/questions/34730385/django-rollback-save-with-transaction-atomic
我应该怎么做才能返回正确的 JSONResponse 并在失败时回滚所有内容?
正如建议的link https://stackoverflow.com/a/34730574/1685980:
事务原子性如果您的,将在数据库上执行事务
视图产生没有错误的响应。因为你正在捕捉
你自己例外,在 Django 看来,你的视图刚刚执行
美好的。如果捕获到异常,需要自己处理
另一种方法是使用transaction.atomic
inside with
(作为上下文管理器),这将确保提交或回滚(再次在同一链接上建议并解释here https://docs.djangoproject.com/en/3.0/topics/db/transactions/#controlling-transactions-explicitly)
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)})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)