您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關怎么在Django中使用transaction管理事務,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
除非手動commit
transaction最基本的功能。
代碼場景:
在事務當前啟動celery異步任務, 無法獲取未提交的改動。
def example_view(request): with transaction.atomic(): change_obj() # 修改對象變量 obj.save() async_task.delay(obj.id) def async_task(obj_id): obj = Model.objects.get(pk=obj_id) read_the_obj() # 讀取對象信息
在使用transaction當中, Model.save()都不做commit,因此如果在transaction當中設置異步任務,使用get()查詢數據庫,將看不到對象在事務當中的改變.這也是實現”可重復讀”的事務隔離級別,即同一個事務里面的多次查詢都應該保持結果不變。
不能理解為python操作的事務管理
代碼如下:
def example_view(request): tag = False with transaction.atomic(): tag = True change_obj() # 修改對象變量 obj.save() raise DataError print("tag = ",tag)
tag = True #輸出內容
即使事務代碼塊發(fā)生了DataError,事務回滾,也僅是數據庫層面的回滾,針對python的操作依然已完成。
甚至是對Model.Object進行的操作會也會存在變量當中。
如:
def example_view(request): obj.changed = False with transaction.atomic(): obj.changed = True change_obj() # 修改對象其他變量 obj.save() raise DataError print("obj.changed = ",obj.changed)
obj.changed = True #輸出內容
發(fā)生Dataerror異常的回滾僅在數據庫層面操作,因此不可以根據model object的屬性值判斷是否正確完成了事務。
另外,雖然Django對數據庫層面以ORM完成了很具體的抽象,但應該要清楚地意識到我們操作的model object和數據庫內容本質不同,DJANGO只在查詢和提交時進行數據庫操作。
補充:Django 事務transaction.atomic()的使用方法
from django.shortcuts import render from django.http import HttpResponse from django.views.generic import View from django.db import transaction # 導入事務 # 類視圖 (事務,@transaction.atomic裝飾器) class MyView(View): @transaction.atomic # transaction.atomic裝飾器可以保證該函數中所有的數據庫操作都在一個事務中。 def post(self, request): # 數據庫操作1。。。 # 數據庫操作2。。。 return HttpResponse('ok') # 類視圖 (事務,保存點的使用) class MyView2(View): @transaction.atomic def post(self, request): # 設置事務保存點 s1 = transaction.savepoint() # 可以設置多個保存點 # 數據庫操作。。。 # 事務回滾 (如果發(fā)生異常,就回滾事務) transaction.savepoint_rollback(s1) # 可以回滾到指定的保存點 # 提交事務 (如果沒有異常,就提交事務) transaction.savepoint_commit(s1) # 返回應答 return HttpResponse('ok')
以上就是怎么在Django中使用transaction管理事務,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。