Django中的事務(wù)ATOMIC_REQUESTS
Django事務(wù)ATOMIC_REQUESTS
Django的默認(rèn)事務(wù)行為
Django 的默認(rèn)行為是以自動(dòng)提交模式運(yùn)行。
除非事務(wù)處于活動(dòng)狀態(tài),否則每個(gè)查詢都會(huì)立即提交到數(shù)據(jù)庫。
將事務(wù)綁定到HTTP請(qǐng)求
在 Web 上處理事務(wù)的常用方法是將每個(gè)請(qǐng)求包裝在事務(wù)中。
在要為其啟用此行為的每個(gè)數(shù)據(jù)庫的配置中設(shè)置ATOMIC_REQUESTS為True。
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'testdb', 'USER': 'hayley', 'PASSWORD': '******', 'HOST': 'localhost', 'PORT': '3306', 'ATOMIC_REQUESTS': True, } }
它是這樣工作的:在調(diào)用視圖函數(shù)之前,Django 會(huì)啟動(dòng)一個(gè)事務(wù)。如果生成的響應(yīng)沒有問題,則 Django 提交事務(wù)。如果視圖產(chǎn)生異常,Django 會(huì)回滾事務(wù)。
您可以使用視圖代碼中的保存點(diǎn)執(zhí)行子事務(wù),通常使用atomic()上下文管理器。但是,在視圖結(jié)束時(shí),將提交所有更改或不提交任何更改。
雖然每個(gè)請(qǐng)求都開啟事務(wù)比較方便,但它也會(huì)在流量增加時(shí)變得低效。為每個(gè)視圖打開一個(gè)事務(wù)有一些開銷。對(duì)性能的影響取決于應(yīng)用程序的查詢模式以及數(shù)據(jù)庫處理鎖定的能力。
以上是全局性的配置, 如果要對(duì)某個(gè)http請(qǐng)求放水(然后自定義事務(wù)),可以用non_atomic_requests修飾器
from django.db import transaction class xxx(xxxView): @transaction.non_atomic_requests def post(self, request, *args, **kwargs): ...
或者關(guān)閉全局事務(wù),為每個(gè)請(qǐng)求單獨(dú)設(shè)置事務(wù):
from django.db import transaction class xxx(xxxView): @transaction.atomic def post(self, request, *args, **kwargs): with transaction.atomic(): ...
Django中的事務(wù)介紹
Django事務(wù)介紹
在Django中,它的 默事務(wù)行為是自動(dòng)提交。
除非事務(wù)正在執(zhí)行,每個(gè)查詢將會(huì)馬上自動(dòng)提交到數(shù)據(jù)庫, 例如:
# ApiData為model ApiData.objects.create(name='測(cè)試名字', path='/') ApiData.objects.filter(id=1).update(name='測(cè)試名字', path='/')
如果沒有手動(dòng)設(shè)置事務(wù),那么這兩條代碼在執(zhí)行完成后就會(huì)馬上提交到數(shù)據(jù)庫中進(jìn)行保存,Django 自動(dòng)使用事務(wù)或還原點(diǎn),以確保需多次查詢的 ORM 操作的一致性,特別是 delete() 和 update() 操作。
使用Django事務(wù)
通過django手動(dòng)創(chuàng)建事務(wù)的方式一般為兩種:裝飾器和 with
:
裝飾器:
@api_view(['POST']) @transaction.atomic def test_views(request): """ 該方法會(huì)在一個(gè)事務(wù)中執(zhí)行 """ ApiData.objects.create(name='測(cè)試名字', path='/') ApiData.objects.filter(id=1).update(name='測(cè)試名字', path='/') return Response(data={'msg': '創(chuàng)建成功!'})
with語句:
@api_view(['POST']) def test_views(request): try: with transaction.atomic(): #僅with包裹的下面的語句會(huì)在事務(wù)中執(zhí)行 ApiData.objects.create(name='測(cè)試名字', path='/') ApiData.objects.filter(id=1).update(name='測(cè)試名字', path='/') except Exception as e: pass return Response(data={'msg': '創(chuàng)建成功!'})
需要注意的是當(dāng)事務(wù)回滾時(shí),模型的屬性需要手動(dòng)恢復(fù)。
例如下面的代碼, obj.active
的初始值是 False
.我們?cè)O(shè)置了 obj.active=True
然后進(jìn)行了保存 obj.save()
操作,但這個(gè)時(shí)候發(fā)生了異常導(dǎo)致保存失敗了,那此時(shí)的 obj.active
的值還是為 True
,并不會(huì)因?yàn)楸4媸《優(yōu)?False
:
from django.db import DatabaseError, transaction obj = MyModel(active=False) obj.active = True try: with transaction.atomic(): obj.save() except DatabaseError: pass if obj.active: #下面的代碼 ...
因此,針對(duì)上面的代碼我們可以在拋異常處將 active
的值設(shè)為 False
來達(dá)到恢復(fù)模型屬性的值的目的:
try: with transaction.atomic(): obj.save() except DatabaseError: obj.active=False #手動(dòng)恢復(fù)active屬性
全局事務(wù)
如果為了圖省事而場(chǎng)景也較為通用,我們可以設(shè)置全局事務(wù)配置來讓每個(gè)請(qǐng)求view都使用事務(wù):
在 settings.py
配置文件中增加下面配置:
ATOMIC_REQUESTS=True
這樣就將每個(gè)視圖包裹在這個(gè)數(shù)據(jù)庫的事務(wù)中了,只有視圖未完成執(zhí)行成功,都將回滾到請(qǐng)求前的初始狀態(tài)。
另外也可以增加 AUTOCOMMIT=False
的配置項(xiàng)來禁用Django的事務(wù)管理以此來使用自定義的事務(wù)。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python模塊與C和C++動(dòng)態(tài)庫相互調(diào)用實(shí)現(xiàn)過程示例
這篇文章主要為大家介紹了python模塊與C和C++動(dòng)態(tài)庫之間相互調(diào)用的實(shí)現(xiàn)過程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11pytorch 網(wǎng)絡(luò)參數(shù) weight bias 初始化詳解
這篇文章主要介紹了pytorch 網(wǎng)絡(luò)參數(shù) weight bias 初始化詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-06-06基于OpenMV的圖像識(shí)別之?dāng)?shù)字識(shí)別功能
OpenMV是一個(gè)開源,低成本,功能強(qiáng)大的機(jī)器視覺模塊。以STM32F427CPU為核心,集成了OV7725攝像頭芯片,在小巧的硬件模塊上,用C語言高效地實(shí)現(xiàn)了核心機(jī)器視覺算法,提供Python編程接口,對(duì)OpenMV的圖像識(shí)別之?dāng)?shù)字識(shí)別相關(guān)知識(shí)感興趣的朋友一起看看吧2021-11-11Python的pdfplumber庫將pdf轉(zhuǎn)為圖片的實(shí)現(xiàn)
本文主要介紹了Python的pdfplumber庫將pdf轉(zhuǎn)為圖片的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06python 統(tǒng)計(jì)代碼耗時(shí)的幾種方法分享
本文實(shí)例講述了Python中統(tǒng)計(jì)代碼片段、函數(shù)運(yùn)行耗時(shí)的幾種方法,分享給大家,僅供參考。2021-04-04基于opencv和pillow實(shí)現(xiàn)人臉識(shí)別系統(tǒng)(附demo)
人臉識(shí)別就是一個(gè)程序能識(shí)別給定圖像或視頻中的人臉,本文主要介紹了opencv和pillow實(shí)現(xiàn)人臉識(shí)別系統(tǒng),本文不涉及分類器、訓(xùn)練識(shí)別器等算法原理,感興趣的可以了解一下2021-11-11