Django事務

Django中涉及到多張表的數據修改,對這些數據的修改應該是一個整體事務,即要麼一起成功,要麼一起失敗。如保存商品訂單、轉賬等。
Django中對於數據庫的事務,默認每執行一句數據庫操作,便會自動提交。
在Django中可以通過django.db.transaction模塊提供的atomic來定義一個事務,atomic提供兩種用法

裝飾器用法

from django.db import transaction

@transaction.atomic
def viewfunc(request):
    # 這些代碼會在一個事務中執行
    ...

with語句用法

from django.db import transaction

def viewfunc(request):
    # 這部分代碼不在事務中,會被Django自動提交
    ...

    with transaction.atomic():
        # 這部分代碼會在事務中執行
        ...

在Django中,還提供了保存點的支持,可以在事務中創建保存點來記錄數據的特定狀態,數據庫出現錯誤時,可以恢復到數據保存點的狀態

from django.db import transaction

# 創建保存點
save_id = transaction.savepoint()  

# 回滾到保存點
transaction.savepoint_rollback(save_id)

# 提交從保存點到當前狀態的所有數據庫事務操作
transaction.savepoint_commit(save_id)

注意:在原子塊中不要進行錯誤捕獲(執行return和raise)

當退出原子塊的時候,Django會去查看它是否正常退出或者是否有異常來確定是否提交或者回滾

如果你捕獲並處理了原子塊中的異常,可能會隱藏Django中發生問題的事實。這樣可能會造成非預期的行爲。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章