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

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

 更新時(shí)間:2021年04月24日 14:31:15   作者:chrispink_yang  
這篇文章主要介紹了解決Django transaction進(jìn)行事務(wù)管理踩過的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

概要

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

簡(jiǎ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 = True
        change_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 = True
        change_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 render
from django.http import HttpResponse
from django.views.generic import View
from 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è)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • Windows下為Python安裝Matplotlib模塊

    Windows下為Python安裝Matplotlib模塊

    這篇文章主要介紹了如何在Windows下為Python安裝Matplotlib模塊的方法,非常的詳細(xì),而且附上了官方的下載地址,小伙伴們操作起來應(yīng)該毫無壓力了。
    2015-11-11
  • Python解決走迷宮問題算法示例

    Python解決走迷宮問題算法示例

    這篇文章主要介紹了Python解決走迷宮問題算法,結(jié)合實(shí)例形式分析了Python基于二維數(shù)組的深度優(yōu)先遍歷算法解決走迷宮問題相關(guān)操作技巧,需要的朋友可以參考下
    2018-07-07
  • Python的條件控制?if?語句詳解

    Python的條件控制?if?語句詳解

    Python的?if?語句用來「控制代碼」的執(zhí)行,「判斷條件成立」時(shí)執(zhí)行一段代碼,判斷條件「不成立」時(shí)執(zhí)行另一段代碼,本文就給大家詳細(xì)講講Python的條件控制?if?語句,需要的朋友可以參考下
    2023-08-08
  • python PyQt5中QRadioButton的詳細(xì)使用教程與應(yīng)用實(shí)戰(zhàn)

    python PyQt5中QRadioButton的詳細(xì)使用教程與應(yīng)用實(shí)戰(zhàn)

    PyQt5是一個(gè)跨平臺(tái)的GUI工具包,用于創(chuàng)建具有Python綁定的Qt應(yīng)用程序,在PyQt5中,QRadioButton是一個(gè)非常有用的控件,用于在用戶界面上提供單選選項(xiàng),本文將詳細(xì)介紹QRadioButton的基本用法、常用屬性和方法,需要的朋友可以參考下
    2024-08-08
  • 《與孩子一起學(xué)編程》python自測(cè)題

    《與孩子一起學(xué)編程》python自測(cè)題

    本文內(nèi)容是關(guān)于《與孩子一起學(xué)編程》python自測(cè)題,大家可以跟著測(cè)試題上機(jī)測(cè)試下程序。
    2018-05-05
  • Numpy的簡(jiǎn)單用法小結(jié)

    Numpy的簡(jiǎn)單用法小結(jié)

    這篇文章主要介紹了Numpy的簡(jiǎn)單用法小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Python 通過監(jiān)聽端口實(shí)現(xiàn)唯一腳本運(yùn)行方式

    Python 通過監(jiān)聽端口實(shí)現(xiàn)唯一腳本運(yùn)行方式

    這篇文章主要介紹了Python 通過監(jiān)聽端口實(shí)現(xiàn)唯一腳本運(yùn)行方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • python中數(shù)字列表轉(zhuǎn)化為數(shù)字字符串的實(shí)例代碼

    python中數(shù)字列表轉(zhuǎn)化為數(shù)字字符串的實(shí)例代碼

    先前學(xué)習(xí)過,數(shù)字和字符串都可以存儲(chǔ)到變量當(dāng)中,下面這篇文章主要給大家介紹了關(guān)于python中數(shù)字列表轉(zhuǎn)化為數(shù)字字符串的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • Tensorflow 自帶可視化Tensorboard使用方法(附項(xiàng)目代碼)

    Tensorflow 自帶可視化Tensorboard使用方法(附項(xiàng)目代碼)

    這篇文章主要介紹了Tensorflow 自帶可視化Tensorboard使用方法(附項(xiàng)目代碼),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-02-02
  • python實(shí)現(xiàn)文件的備份流程詳解

    python實(shí)現(xiàn)文件的備份流程詳解

    在本篇文章中我們給大家整理了關(guān)于python實(shí)現(xiàn)文件的備份的詳細(xì)流程步驟,有興趣的朋友們學(xué)習(xí)下。
    2019-06-06

最新評(píng)論

宜兰市| 双鸭山市| 温宿县| 北宁市| 个旧市| 丰顺县| 上杭县| 长汀县| 乡城县| 长岭县| 临沂市| 丹凤县| 内江市| 黎城县| 育儿| 大洼县| 蓝田县| 海淀区| 木兰县| 旅游| 杭锦旗| 石柱| 徐州市| 屯留县| 韩城市| 息烽县| 扎兰屯市| 崇义县| 五大连池市| 思南县| 夹江县| 航空| 榕江县| 德庆县| 通化县| 西充县| 集安市| 巧家县| 鸡西市| 遵义县| 兴文县|