亚洲免费在线视频-亚洲啊v-久久免费精品视频-国产精品va-看片地址-成人在线视频网

您的位置:首頁技術(shù)文章
文章詳情頁

解決Django transaction進(jìn)行事務(wù)管理踩過的坑

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

Transaction是django進(jìn)行數(shù)據(jù)庫原子性操作在python層面上的實(shí)現(xiàn)。

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

1. transaction事務(wù)內(nèi)不執(zhí)行數(shù)據(jù)庫的commit操作

除非手動(dòng)commit

transaction最基本的功能。

代碼場(chǎng)景:

在事務(wù)當(dāng)前啟動(dòng)celery異步任務(wù), 無法獲取未提交的改動(dòng)。

def example_view(request): with transaction.atomic():change_obj() # 修改對(duì)象變量obj.save()async_task.delay(obj.id)def async_task(obj_id): obj = Model.objects.get(pk=obj_id) read_the_obj() # 讀取對(duì)象信息

在使用transaction當(dāng)中, Model.save()都不做commit,因此如果在transaction當(dāng)中設(shè)置異步任務(wù),使用get()查詢數(shù)據(jù)庫,將看不到對(duì)象在事務(wù)當(dāng)中的改變.這也是實(shí)現(xiàn)”可重復(fù)讀”的事務(wù)隔離級(jí)別,即同一個(gè)事務(wù)里面的多次查詢都應(yīng)該保持結(jié)果不變。

2.transaction只對(duì)數(shù)據(jù)庫層的操作進(jìn)行事務(wù)管理

不能理解為python操作的事務(wù)管理

代碼如下:

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

tag = True #輸出內(nèi)容

即使事務(wù)代碼塊發(fā)生了DataError,事務(wù)回滾,也僅是數(shù)據(jù)庫層面的回滾,針對(duì)python的操作依然已完成。

甚至是對(duì)Model.Object進(jìn)行的操作會(huì)也會(huì)存在變量當(dāng)中。

如:

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

obj.changed = True #輸出內(nèi)容

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

另外,雖然Django對(duì)數(shù)據(jù)庫層面以O(shè)RM完成了很具體的抽象,但應(yīng)該要清楚地意識(shí)到我們操作的model object和數(shù)據(jù)庫內(nèi)容本質(zhì)不同,DJANGO只在查詢和提交時(shí)進(jìn)行數(shù)據(jù)庫操作。

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

看代碼吧~

from django.shortcuts import renderfrom django.http import HttpResponsefrom django.views.generic import Viewfrom django.db import transaction # 導(dǎo)入事務(wù) # 類視圖 (事務(wù),@transaction.atomic裝飾器)class MyView(View): @transaction.atomic # transaction.atomic裝飾器可以保證該函數(shù)中所有的數(shù)據(jù)庫操作都在一個(gè)事務(wù)中。 def post(self, request): # 數(shù)據(jù)庫操作1。。。# 數(shù)據(jù)庫操作2。。。return HttpResponse(’ok’) # 類視圖 (事務(wù),保存點(diǎn)的使用)class MyView2(View): @transaction.atomic def post(self, request): # 設(shè)置事務(wù)保存點(diǎn)s1 = transaction.savepoint() # 可以設(shè)置多個(gè)保存點(diǎn) # 數(shù)據(jù)庫操作。。。 # 事務(wù)回滾 (如果發(fā)生異常,就回滾事務(wù))transaction.savepoint_rollback(s1) # 可以回滾到指定的保存點(diǎn) # 提交事務(wù) (如果沒有異常,就提交事務(wù))transaction.savepoint_commit(s1) # 返回應(yīng)答return HttpResponse(’ok’)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

標(biāo)簽: Django
相關(guān)文章:
主站蜘蛛池模板: 好吊色37pao在线观看 | 欧美在线精品一区二区三区 | 网站三级| 国产一区二区影院 | 国产一级生活片 | 亚洲a级片 | 亚洲精品国产美女在线观看 | 成年美女黄网站色视频大全免费 | 日韩在线视频线视频免费网站 | 日韩一区视频在线 | 亚洲欧美日韩高清综合678 | 精品欧美一区二区精品久久 | 一区二区免费看 | 国产精品久久久久久久久免费观看 | 国产三级做爰在线观看 | 在线看免费观看韩国特黄一级 | 涩里番资源网站在线观看 | 国产成人a毛片在线 | 男女乱淫视频 | 日本不卡一区视频 | 日本一级视频 | 奇米网狠狠干 | 欧美三级久久 | 男人的天堂久久精品激情 | 久久这里只有精品视频99 | 精品久久久久久中文字幕 | 日韩欧一级毛片在线播无遮挡 | 视频一区视频二区在线观看 | 欧美性妇 | 日本一级爽毛片在线看 | 欧美国产成人免费观看永久视频 | 色综合久久88色综合天天 | 日韩美女视频在线观看 | 91精品欧美一区二区综合在线 | 97国产精品欧美一区二区三区 | 日本暖暖视频在线播放 | 特及毛片 | 亚洲免费精品 | 丝袜美腿精品一区二区三 | 亚洲三级黄 | 国产精品高清一区二区 |