最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django中的事務(wù)ATOMIC_REQUESTS

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

Django事務(wù)ATOMIC_REQUESTS

Django的默認(rèn)事務(wù)行為

Django 的默認(rèn)行為是以自動提交模式運(yùn)行。

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

將事務(wù)綁定到HTTP請求

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

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

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

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

以上是全局性的配置, 如果要對某個http請求放水(然后自定義事務(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ù),為每個請求單獨(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ù)行為是自動提交。

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

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

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

使用Django事務(wù)

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

裝飾器:

@api_view(['POST'])
@transaction.atomic
def test_views(request):
    """
    該方法會在一個事務(wù)中執(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包裹的下面的語句會在事務(wù)中執(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)建成功!'})

需要注意的是當(dāng)事務(wù)回滾時,模型的屬性需要手動恢復(fù)。

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

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

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

全局事務(wù)

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

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

ATOMIC_REQUESTS=True

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

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

總結(jié)

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

相關(guān)文章

最新評論

和林格尔县| 错那县| 宜章县| 香港| 桓仁| 皋兰县| 怀宁县| 阿坝县| 丰原市| 象州县| 庆城县| 工布江达县| 巨鹿县| 志丹县| 安宁市| 阳江市| 松江区| 屯留县| 若尔盖县| 桂阳县| 玉树县| 文山县| 监利县| 奈曼旗| 上林县| 汝州市| 达孜县| 香港 | 桦南县| 班玛县| 怀仁县| 徐州市| 绵竹市| 石泉县| 个旧市| 金川县| 陆河县| 景洪市| 潞西市| 台前县| 彰武县|