亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Django中的事務ATOMIC_REQUESTS

 更新時間:2023年08月24日 16:11:52   作者:藍綠色~菠菜  
這篇文章主要介紹了Django中的事務ATOMIC_REQUESTS使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

Django事務ATOMIC_REQUESTS

Django的默認事務行為

Django 的默認行為是以自動提交模式運行。

除非事務處于活動狀態(tài),否則每個查詢都會立即提交到數(shù)據(jù)庫。

將事務綁定到HTTP請求

在 Web 上處理事務的常用方法是將每個請求包裝在事務中。

在要為其啟用此行為的每個數(shù)據(jù)庫的配置中設置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 會啟動一個事務。如果生成的響應沒有問題,則 Django 提交事務。如果視圖產(chǎn)生異常,Django 會回滾事務。

您可以使用視圖代碼中的保存點執(zhí)行子事務,通常使用atomic()上下文管理器。但是,在視圖結束時,將提交所有更改或不提交任何更改。

雖然每個請求都開啟事務比較方便,但它也會在流量增加時變得低效。為每個視圖打開一個事務有一些開銷。對性能的影響取決于應用程序的查詢模式以及數(shù)據(jù)庫處理鎖定的能力。

以上是全局性的配置, 如果要對某個http請求放水(然后自定義事務),可以用non_atomic_requests修飾器

from django.db import transaction
class xxx(xxxView):
    @transaction.non_atomic_requests
    def post(self, request, *args, **kwargs):
        ...
 

或者關閉全局事務,為每個請求單獨設置事務:

 
from django.db import transaction
class xxx(xxxView):
    @transaction.atomic
    def post(self, request, *args, **kwargs):
        with transaction.atomic():
            ...
 

Django中的事務介紹

Django事務介紹

在Django中,它的 默事務行為是自動提交。

除非事務正在執(zhí)行,每個查詢將會馬上自動提交到數(shù)據(jù)庫, 例如:

# ApiData為model
ApiData.objects.create(name='測試名字', path='/')
ApiData.objects.filter(id=1).update(name='測試名字', path='/')

如果沒有手動設置事務,那么這兩條代碼在執(zhí)行完成后就會馬上提交到數(shù)據(jù)庫中進行保存,Django 自動使用事務或還原點,以確保需多次查詢的 ORM 操作的一致性,特別是 delete() 和 update() 操作。

使用Django事務

通過django手動創(chuàng)建事務的方式一般為兩種:裝飾器和 with :

裝飾器:

@api_view(['POST'])
@transaction.atomic
def test_views(request):
    """
    該方法會在一個事務中執(zhí)行
    """
    ApiData.objects.create(name='測試名字', path='/')
    ApiData.objects.filter(id=1).update(name='測試名字', path='/')
    return Response(data={'msg': '創(chuàng)建成功!'})

with語句:

@api_view(['POST'])
def test_views(request):
    try:
        with transaction.atomic(): #僅with包裹的下面的語句會在事務中執(zhí)行
            ApiData.objects.create(name='測試名字', path='/')
            ApiData.objects.filter(id=1).update(name='測試名字', path='/')
    except Exception as e:
        pass
    return Response(data={'msg': '創(chuàng)建成功!'})

需要注意的是當事務回滾時,模型的屬性需要手動恢復。

例如下面的代碼, obj.active 的初始值是 False .我們設置了 obj.active=True 然后進行了保存 obj.save() 操作,但這個時候發(fā)生了異常導致保存失敗了,那此時的 obj.active 的值還是為 True ,并不會因為保存失敗而變?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: #下面的代碼
    ...

因此,針對上面的代碼我們可以在拋異常處將 active 的值設為 False 來達到恢復模型屬性的值的目的:

try:
    with transaction.atomic():
        obj.save()
except DatabaseError:
    obj.active=False #手動恢復active屬性

全局事務

如果為了圖省事而場景也較為通用,我們可以設置全局事務配置來讓每個請求view都使用事務:

settings.py 配置文件中增加下面配置:

ATOMIC_REQUESTS=True

這樣就將每個視圖包裹在這個數(shù)據(jù)庫的事務中了,只有視圖未完成執(zhí)行成功,都將回滾到請求前的初始狀態(tài)。

另外也可以增加 AUTOCOMMIT=False 的配置項來禁用Django的事務管理以此來使用自定義的事務。

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • python二叉樹類以及其4種遍歷方法實例

    python二叉樹類以及其4種遍歷方法實例

    二叉樹是一種特殊的樹,最直觀地體現(xiàn)于它的每個節(jié)點至多有兩個子節(jié)點,二叉樹是非常實用的一種數(shù)據(jù)結構,常常用于實現(xiàn)二叉查找樹及二叉堆等,下面這篇文章主要給大家介紹了關于python二叉樹類以及其4種遍歷方法的相關資料,需要的朋友可以參考下
    2022-05-05
  • 詳解python的集合set的函數(shù)

    詳解python的集合set的函數(shù)

    這篇文章主要為大家介紹了python的集合set的函數(shù),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • python模塊與C和C++動態(tài)庫相互調(diào)用實現(xiàn)過程示例

    python模塊與C和C++動態(tài)庫相互調(diào)用實現(xiàn)過程示例

    這篇文章主要為大家介紹了python模塊與C和C++動態(tài)庫之間相互調(diào)用的實現(xiàn)過程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11
  • pytorch  網(wǎng)絡參數(shù) weight bias 初始化詳解

    pytorch 網(wǎng)絡參數(shù) weight bias 初始化詳解

    這篇文章主要介紹了pytorch 網(wǎng)絡參數(shù) weight bias 初始化詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • Python flask返回中文亂碼的解決方法分享

    Python flask返回中文亂碼的解決方法分享

    有時使用flask返回數(shù)據(jù)會出現(xiàn)帶有中文的時候會顯示成亂碼(ascii)的情況出現(xiàn),所以本文為大家整理了一下解決的方法,需要的小伙伴可以參考一下
    2023-07-07
  • 基于OpenMV的圖像識別之數(shù)字識別功能

    基于OpenMV的圖像識別之數(shù)字識別功能

    OpenMV是一個開源,低成本,功能強大的機器視覺模塊。以STM32F427CPU為核心,集成了OV7725攝像頭芯片,在小巧的硬件模塊上,用C語言高效地實現(xiàn)了核心機器視覺算法,提供Python編程接口,對OpenMV的圖像識別之數(shù)字識別相關知識感興趣的朋友一起看看吧
    2021-11-11
  • Python的pdfplumber庫將pdf轉(zhuǎn)為圖片的實現(xiàn)

    Python的pdfplumber庫將pdf轉(zhuǎn)為圖片的實現(xiàn)

    本文主要介紹了Python的pdfplumber庫將pdf轉(zhuǎn)為圖片的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • 便捷提取python導入包的屬性方法

    便捷提取python導入包的屬性方法

    今天小編就為大家分享一篇便捷提取python導入包的屬性方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • python 統(tǒng)計代碼耗時的幾種方法分享

    python 統(tǒng)計代碼耗時的幾種方法分享

    本文實例講述了Python中統(tǒng)計代碼片段、函數(shù)運行耗時的幾種方法,分享給大家,僅供參考。
    2021-04-04
  • 基于opencv和pillow實現(xiàn)人臉識別系統(tǒng)(附demo)

    基于opencv和pillow實現(xiàn)人臉識別系統(tǒng)(附demo)

    人臉識別就是一個程序能識別給定圖像或視頻中的人臉,本文主要介紹了opencv和pillow實現(xiàn)人臉識別系統(tǒng),本文不涉及分類器、訓練識別器等算法原理,感興趣的可以了解一下
    2021-11-11

最新評論