国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

解決Django transaction進行事務管理踩過的坑

瀏覽:2日期:2024-09-09 15:18:46
概要

Transaction是django進行數據庫原子性操作在python層面上的實現。

簡單來說, 被transaction.atomic()包裹的代碼塊只在代碼塊順利完成后進行數據庫層面的commit。實際開發當中,遇到了一些問題。

1. transaction事務內不執行數據庫的commit操作

除非手動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()查詢數據庫,將看不到對象在事務當中的改變.這也是實現”可重復讀”的事務隔離級別,即同一個事務里面的多次查詢都應該保持結果不變。

2.transaction只對數據庫層的操作進行事務管理

不能理解為python操作的事務管理

代碼如下:

def example_view(request): tag = False with transaction.atomic():tag = Truechange_obj() # 修改對象變量obj.save()raise DataError print('tag = ',tag)

tag = True #輸出內容

即使事務代碼塊發生了DataError,事務回滾,也僅是數據庫層面的回滾,針對python的操作依然已完成。

甚至是對Model.Object進行的操作會也會存在變量當中。

如:

def example_view(request): obj.changed = False with transaction.atomic():obj.changed = Truechange_obj() # 修改對象其他變量obj.save()raise DataError print('obj.changed = ',obj.changed)

obj.changed = True #輸出內容

發生Dataerror異常的回滾僅在數據庫層面操作,因此不可以根據model object的屬性值判斷是否正確完成了事務。

另外,雖然Django對數據庫層面以ORM完成了很具體的抽象,但應該要清楚地意識到我們操作的model object和數據庫內容本質不同,DJANGO只在查詢和提交時進行數據庫操作。

補充:Django 事務transaction.atomic()的使用方法

看代碼吧~

from django.shortcuts import renderfrom django.http import HttpResponsefrom django.views.generic import Viewfrom 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() # 可以設置多個保存點 # 數據庫操作。。。 # 事務回滾 (如果發生異常,就回滾事務)transaction.savepoint_rollback(s1) # 可以回滾到指定的保存點 # 提交事務 (如果沒有異常,就提交事務)transaction.savepoint_commit(s1) # 返回應答return HttpResponse(’ok’)

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。如有錯誤或未考慮完全的地方,望不吝賜教。

標簽: Django
相關文章:
主站蜘蛛池模板: 免费观看女人一摸全是水 | 久青草青综合在线视频 | 韩国福利影视一区二区三区 | 99精品国产高清一区二区三区香蕉 | 成人入口 | 欧美性色xo在线 | 亚洲偷偷自拍 | 97在线视频观看 | 日韩中文字幕网 | 毛片图片 | 国产网站免费 | 亚洲欧美日韩国产综合高清 | 精品午夜寂寞影院在线观看 | 人成精品视频三区二区一区 | 欧美日韩加勒比一区二区三区 | 超91精品手机国产在线 | 久久99精品免费视频 | 国产三级做爰高清视频a | 久久精品一区二区三区中文字幕 | 成人18视频在线 | 欧美成人性色xxxx视频 | 国产精品秒播无毒不卡 | 99re5久久在热线播放 | 欧美成人精品欧美一级乱黄 | 免费在线精品视频 | 爆操巨乳美女 | 久久不见久久见免费影院www日本 | 欧美级| 国产区更新| 亚洲欧美中文日韩二区一区 | 美女视频一区二区三区在线 | 久久天天躁综合夜夜黑人鲁色 | 欧美日韩一区二区综合在线视频 | 欧美jizzhd精品欧美另类 | 欧美 在线 成 人怡红院 | 成人午夜大片免费7777 | 日本a级特黄三级三级三级 日本a一级片 | 亚洲美女性生活视频 | 亚洲伊人色一综合网 | pgone太大了兽王免费视频 | 国产一级a毛片高清 |