簡體   English   中英

Django無法使用原子事務的try-exception塊回滾

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM