[英]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.