欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解決Django transaction進行事務管理踩過的坑

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

概要

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

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

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

除非手動commit

transaction最基本的功能。

代碼場景:

在事務當前啟動celery異步任務, 無法獲取未提交的改動。

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

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

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

不能理解為python操作的事務管理

代碼如下:

def example_view(request):
    tag = False
    with transaction.atomic():
        tag = True
        change_obj() # 修改對象變量
        obj.save()
        raise DataError
    print("tag = ",tag)
tag = True #輸出內(nèi)容

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

甚至是對Model.Object進行的操作會也會存在變量當中。

如:

def example_view(request):
    obj.changed = False
    with transaction.atomic():
        obj.changed = True
        change_obj() # 修改對象其他變量
        obj.save()
        raise DataError
    print("obj.changed = ",obj.changed)
obj.changed = True #輸出內(nèi)容

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

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

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

看代碼吧~

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

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • 對Django外鍵關(guān)系的描述

    對Django外鍵關(guān)系的描述

    今天小編就為大家分享一篇對Django外鍵關(guān)系的描述,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Python基于回溯法子集樹模板解決選排問題示例

    Python基于回溯法子集樹模板解決選排問題示例

    這篇文章主要介紹了Python基于回溯法子集樹模板解決選排問題,簡單描述了選排問題并結(jié)合實例形式分析了Python使用回溯法子集樹模板解決選排問題的具體實現(xiàn)步驟與相關(guān)操作注意事項,需要的朋友可以參考下
    2017-09-09
  • Python 可愛的大小寫

    Python 可愛的大小寫

    和其他語言一樣,Python為string對象提供了轉(zhuǎn)換大小寫的方法:upper() 和 lower()。還不止這些,Python還為我們提供了首字母大寫,其余小寫的capitalize()方法,以及所有單詞首字母大寫,其余小寫的title()方法。
    2008-09-09
  • python paramiko模塊學習分享

    python paramiko模塊學習分享

    這篇文章主要為大家分享了python paramiko模塊的學習資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • 了解一下python內(nèi)建模塊collections

    了解一下python內(nèi)建模塊collections

    這篇文章主要介紹了Python內(nèi)建模塊——collections的相關(guān)資料,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-09-09
  • 用pytorch的nn.Module構(gòu)造簡單全鏈接層實例

    用pytorch的nn.Module構(gòu)造簡單全鏈接層實例

    今天小編就為大家分享一篇用pytorch的nn.Module構(gòu)造簡單全鏈接層實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • python爬蟲利用selenium實現(xiàn)自動翻頁爬取某魚數(shù)據(jù)的思路詳解

    python爬蟲利用selenium實現(xiàn)自動翻頁爬取某魚數(shù)據(jù)的思路詳解

    這篇文章主要介紹了python爬蟲利用selenium實現(xiàn)自動翻頁爬取某魚數(shù)據(jù)的思路詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • python傳遞參數(shù)方式小結(jié)

    python傳遞參數(shù)方式小結(jié)

    這篇文章主要介紹了python傳遞參數(shù)方式,實例總結(jié)了Python常用的參數(shù)傳遞方式,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • python 多進程隊列數(shù)據(jù)處理詳解

    python 多進程隊列數(shù)據(jù)處理詳解

    今天小編就為大家分享一篇python 多進程隊列數(shù)據(jù)處理詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • python詞云庫wordcloud的使用方法與實例詳解

    python詞云庫wordcloud的使用方法與實例詳解

    這篇文章主要介紹了python詞云庫wordcloud的使用方法與實例詳解,需要的朋友可以參考下
    2020-02-02

最新評論