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中發生問題的事實。這樣可能會造成非預期的行爲。