django中如何處理事務


生成訂單時,一次性生成多條數據記錄或者一次性操作多個模型,都有可能產生中途報錯的情況,所以需要在生成訂單時保證多個數據操作的原子性。

事務

在完成一個整體功能時,操作到了多個表數據,或者同一個表的多條記錄,如果要保證這些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) #回滾到標記點


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM