日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python django事务transaction源码分析

發(fā)布時間:2025/7/14 python 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python django事务transaction源码分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2019獨角獸企業(yè)重金招聘Python工程師標準>>>

python Django事務(wù)

網(wǎng)上關(guān)于django1.6的事務(wù)資料很多,但是1.8的卻搜不到任何資料,自己要用的時候費了不少勁就是不行,現(xiàn)在記下要用的人少走彎路 version:Django 1.8 事務(wù)官方文檔 事務(wù)中文文檔 里面介紹很多方法,不一一贅述,按照文檔即可,下面只分析下atomic方法的源碼 按照官方文檔 transaction.atomic 有兩種用法裝飾器和上下文管理器

# atomic() 方法 # from django.db import transaction ################### # atomic() ################### def atomic(using=None, savepoint=True): # 裝飾器和上下文管理器必須.()調(diào)用方法,因為真正的處理是該方法返回的實例,不是該方法本身if callable(using):return Atomic(DEFAULT_DB_ALIAS, savepoint)(using)# Decorator: @atomic(...) or context manager: with atomic(...): ...else:return Atomic(using, savepoint) ########################################## # Atomic類 省略了非核心內(nèi)容 ############################################ class Atomic(ContextDecorator):def __init__(self, using, savepoint):self.using = usingself.savepoint = savepointdef __enter__(self):connection = get_connection(self.using)sid = connection.savepoint() # 進入with創(chuàng)建一個保存點# .............dodef __exit__(self, exc_type, exc_value, traceback):if connection.in_atomic_block:# do.............if sid is not None:try:connection.savepoint_commit(sid) # 提交事務(wù)except DatabaseError:try:connection.savepoint_rollback(sid) # 捕獲數(shù)據(jù)庫異常回滾connection.savepoint_commit(sid)except Error:connection.needs_rollback = Trueraise## 還有一段代碼是exec_type收到其他程序異常時候 全局回滾,此處省略# do................. ############################### # ContextDecorator ################################# class ContextDecorator(object):def __call__(self, func):def inner(*args, **kwargs):with self: # 把函數(shù)放進self的with上下文管理器,效果with相同,只是控制細粒度不同return func(*args, **kwargs)return inner

python MySQLdb

class Tran():def __init__(self, conn=None, close=True):if conn is None: # 創(chuàng)建數(shù)據(jù)庫鏈接print 'init'self.conn = conn_tbkt()self.cur = self.conn.cursor()self.sql = []def __enter__(self): # 上下文管理器返回 sql語句列表 with Tran('tbkt_pxb') as sqls:print 'enter'return self.sql # sql.append('select 1')def __exit__(self, exc_type, exc_val, exc_tb):print 'exit'try:print self.sql # 執(zhí)行sqlfor s in self.sql:self.cur.execute(s)self.conn.commit()except: # 可以捕獲所有異常(django事務(wù)如果中間出現(xiàn)程序異常終止無法回滾)try: # 回滾本身也是sql執(zhí)行,也有可能失敗import tracebacktraceback.print_exc()print 'rollback'self.conn.rollback()except:print u'回滾失敗'finally:self.cur.close()self.conn.close()

更細粒度的回滾:

# 在事務(wù)塊中@atomic() 或者 with atomic(): sid = transaction.savepoint('tbkt_pxb') try:# do .......... except:transaction.savepoint_rollback(sid, 'tbkt_pxb')

注意:如果有多個數(shù)據(jù)庫有路由,則需要指定和路由返回一致的useing: math2下的model需要事務(wù),即使ziyuan_new和default是同一個庫,也必須使用useing=ziyuan_new

ziyuan_app = ['math2', 'ziyuan']if model._meta.app_label in ziyuan_app:return "ziyuan_new"return 'default'

調(diào)用時候必須.()方法調(diào)用

atomic塊中必須注意try的使用,如果手動捕獲了程序錯誤會導(dǎo)致atomic包裝器捕獲不到異常,也就不會回滾。要么try內(nèi)代碼不影響事務(wù)操作,要么就捕獲異常后raise出,讓atomic可以正常回滾(就是因為沒有注意到這個問題,導(dǎo)致嘗試了好幾天都沒成功,切記)

轉(zhuǎn)載于:https://my.oschina.net/watcher/blog/718449

總結(jié)

以上是生活随笔為你收集整理的python django事务transaction源码分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。