數據庫事務
在保存訂單數據中,涉及到多張表(OrderInfo、OrderGoods、SKU)的數據修改,對這些數據的修改應該是一個整體事務,即要么一起成功,要么一起失敗。
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)