主頁 > 知識庫 > 解決Django transaction進(jìn)行事務(wù)管理踩過的坑

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

熱門標(biāo)簽:房產(chǎn)電銷外呼系統(tǒng) 上海機器人外呼系統(tǒng)哪家好 地圖標(biāo)注微信發(fā)送位置不顯示 315電話機器人廣告 浙江電銷卡外呼系統(tǒng)好用嗎 蓋州市地圖標(biāo)注 地圖制圖標(biāo)注位置改變是移位嗎 南京銷售外呼系統(tǒng)軟件 地圖標(biāo)注的意義點

概要

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

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

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

除非手動commit

transaction最基本的功能。

代碼場景:

在事務(wù)當(dāng)前啟動celery異步任務(wù), 無法獲取未提交的改動。

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

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

不能理解為python操作的事務(wù)管理

代碼如下:

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

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

甚至是對Model.Object進(jìn)行的操作會也會存在變量當(dāng)中。

如:

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的屬性值判斷是否正確完成了事務(wù)。

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

補充: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ù)庫操作都在一個事務(wù)中。
    def post(self, request):
 
        # 數(shù)據(jù)庫操作1。。。
        # 數(shù)據(jù)庫操作2。。。        
        return HttpResponse('ok') 
 
# 類視圖 (事務(wù),保存點的使用)
class MyView2(View):
    @transaction.atomic
    def post(self, request): 
        # 設(shè)置事務(wù)保存點
        s1 = transaction.savepoint()   # 可以設(shè)置多個保存點
 
        # 數(shù)據(jù)庫操作。。。
 
        # 事務(wù)回滾 (如果發(fā)生異常,就回滾事務(wù))
        transaction.savepoint_rollback(s1)  # 可以回滾到指定的保存點
 
        # 提交事務(wù) (如果沒有異常,就提交事務(wù))
        transaction.savepoint_commit(s1)
 
        # 返回應(yīng)答
        return HttpResponse('ok')    

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

您可能感興趣的文章:
  • python django事務(wù)transaction源碼分析詳解
  • Django bulk_create()、update()與數(shù)據(jù)庫事務(wù)的效率對比分析
  • django中使用事務(wù)及接入支付寶支付功能
  • Django框架orM與自定義SQL語句混合事務(wù)控制操作
  • django框架事務(wù)處理小結(jié)【ORM 事務(wù)及raw sql,customize sql 事務(wù)處理】
  • 使用Python的Django框架實現(xiàn)事務(wù)交易管理的教程

標(biāo)簽:貴州 金華 日照 陽泉 克拉瑪依 赤峰 臨汾 雙鴨山

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《解決Django transaction進(jìn)行事務(wù)管理踩過的坑》,本文關(guān)鍵詞  解決,Django,transaction,進(jìn)行,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《解決Django transaction進(jìn)行事務(wù)管理踩過的坑》相關(guān)的同類信息!
  • 本頁收集關(guān)于解決Django transaction進(jìn)行事務(wù)管理踩過的坑的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章