生成訂單時,一次性生成多條數據記錄或者一次性操作多個模型,都有可能產生中途報錯的情況,所以需要在生成訂單時保證多個數據操作的原子性。
事務
在完成一個整體功能時,操作到了多個表數據,或者同一個表的多條記錄,如果要保證這些sql語句操作作為一個整體保存到數據庫中,那么可以使用事務(transation)
事務具有4個特征,5個隔離等級
四個特性:一致性,原子性,隔離性,持久性
# 隔離性: 兩個事務的隔離性,隔離性的修改可以通過數據庫的配置文件進行修改
五個隔離級別: 串行隔離,可重復讀,已提交讀,未提交讀,沒有隔離級別
原子性(Atomicity)
一致性(Consistency)
隔離性(Isolation)[事務隔離級別->幻讀,臟讀]
持久性(Durability)
在mysql中有專門的SQl語句來完成事務的操作,事務操作一般有3個步驟:
設置事務開始 start transation; \begin;
事務的處理[增刪改]
設置事務的回滾或者提交 rollback / commit
mysql 存儲過程 異常捕獲來完成自動回滾
在 django等web框架中,只要ORM模型,一般都會實現了事務操作封裝
所以在django中我們可以直接使用ORM模型提供的事務操作方法即可完成事務的操作
django框架中操作事務的方法
方法一
from django.db import transaction # 先導入處理事務的transaction模塊
from rest_framework.views import APIView
class OrderAPIView(APIView):
@transaction.atomic #開啟事務,當方法執行完成以后,自動提交事務
def post(self,request):
...
方法二
from django.db import transaction
from rest_framework.views import APIView
class OrderAPIView(APIView):
def post(self, request):
...
with transaction.atomic() # 開始事務,當with語句執行完成以后,自動提交事務
# 數據庫操作
....
在使用事務過程中,有時候會出現異常,當出現異常的時候,我們需要讓程序停止下來,同時需要回滾事務
from django.db import transaction
from rest_framework.views import APIView
class OrderAPIView(APIView):
def post(self, request):
...
with transaction.atomic():
# 設置事務回滾的標記點
sid = transaction.savepoint()
...
try:
...
except:
transaction.savepoint_rollback(sid) #回滾到標記點