python django事务transaction源码分析详解

 更新时间:2017年03月17日 11:03:53   作者:张豪飞  
这篇文章主要介绍了python django事务transaction源码分析详解的相关资料,需要的朋友可以参考下

python Django事务

网上关于django1.6的事务资料很多,但是1.8的却搜不到任何资料,自己要用的时候费了不少劲就是不行,现在记下要用的人少走弯路 version:Django 1.8 事务官方文档 事务中文文档 里面介绍很多方法,不一一赘述,按照文档即可,下面只分析下atomic方法的源码 按照官方文档 transaction.atomic 有两种用法装饰器和上下文管理器

# atomic() 方法 
# from django.db import transaction
###################
# atomic()
###################
def atomic(using=None, savepoint=True): # 装饰器和上下文管理器必须.()调用方法,因为真正的处理是该方法返回的实例,不是该方法本身
 if callable(using):
  return Atomic(DEFAULT_DB_ALIAS, savepoint)(using)
 # Decorator: @atomic(...) or context manager: with atomic(...): ...
 else:
  return Atomic(using, savepoint)
##########################################
# Atomic类 省略了非核心内容
############################################
class Atomic(ContextDecorator):
 def __init__(self, using, savepoint):
 self.using = using
 self.savepoint = savepoint
 def __enter__(self):
 connection = get_connection(self.using)
 sid = connection.savepoint()   # 进入with创建一个保存点
 # .............do
 def __exit__(self, exc_type, exc_value, traceback):
 if connection.in_atomic_block:
 # do.............
 if sid is not None:
  try:
   connection.savepoint_commit(sid)  # 提交事务
  except DatabaseError:
   try:
    connection.savepoint_rollback(sid) # 捕获数据库异常回滚
    connection.savepoint_commit(sid)
   except Error:
    connection.needs_rollback = True
   raise
 ## 还有一段代码是exec_type收到其他程序异常时候 全局回滚,此处省略
 # do.................
###############################
# ContextDecorator
#################################
class ContextDecorator(object):
 def __call__(self, func):
  def inner(*args, **kwargs):
   with self:    # 把函数放进self的with上下文管理器,效果with相同,只是控制细粒度不同
    return func(*args, **kwargs)
  return inner

python MySQLdb

class Tran():
 def __init__(self, conn=None, close=True):
  if conn is None:     # 创建数据库链接
   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        # 执行sql
   for s in self.sql:
    self.cur.execute(s)
   self.conn.commit()
  except:            # 可以捕获所有异常(django事务如果中间出现程序异常终止无法回滚)
   try:     # 回滚本身也是sql执行,也有可能失败
    import traceback
    traceback.print_exc()
    print 'rollback'
    self.conn.rollback()
   except:
    print u'回滚失败'
  finally:
   self.cur.close()
   self.conn.close()

更细粒度的回滚:

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

注意:如果有多个数据库有路由,则需要指定和路由返回一致的useing: math2下的model需要事务,即使ziyuan_new和default是同一个库,也必须使用useing=ziyuan_new

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

  return 'default'

调用时候必须.()方法调用

atomic块中必须注意try的使用,如果手动捕获了程序错误会导致atomic包装器捕获不到异常,也就不会回滚。要么try内代码不影响事务操作,要么就捕获异常后raise出,让atomic可以正常回滚(就是因为没有注意到这个问题,导致尝试了好几天都没成功,切记)

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • python写入csv时writerow()和writerows()函数简单示例

    python写入csv时writerow()和writerows()函数简单示例

    这篇文章主要给大家介绍了关于python写入csv时writerow()和writerows()函数的相关资料,writerows和writerow是Python中csv模块中的两个函数,用于将数据写入CSV文件,需要的朋友可以参考下
    2023-07-07
  • python正则表达式匹配IP代码实例

    python正则表达式匹配IP代码实例

    这篇文章主要介绍了python正则表达式匹配IP代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • 跟老齐学Python之正规地说一句话

    跟老齐学Python之正规地说一句话

    虽然在第一部分中,已经零星涉及到语句问题,并且在不同场合也进行了一些应用。毕竟不那么系统。本部分,就比较系统地介绍python中的语句。
    2014-09-09
  • PyCharm2021最新激活码+激活码补丁(亲测最新版PyCharm2021.3激活成功)

    PyCharm2021最新激活码+激活码补丁(亲测最新版PyCharm2021.3激活成功)

    这篇文章主要介绍了PyCharm2021最新激活码+激活码补丁,亲测最新版PyCharm2021.3激活成功,PyCharm2020激活成功
    2020-09-09
  • Python巧用SnowNLP实现生成srt字幕文件

    Python巧用SnowNLP实现生成srt字幕文件

    SnowNLP是一个可以方便的处理中文文本内容的python类库,本文主要为大家详细介绍了Python如何巧用SnowNLP实现将一段话一键生成srt字幕文件,感兴趣的可以了解下
    2024-01-01
  • Python使用tkinter模块实现推箱子游戏

    Python使用tkinter模块实现推箱子游戏

    这篇文章主要介绍了Python使用tkinter模块实现推箱子游戏,主要分享两点,第一就是这个程序的实现过程,第二点就是我在编写过程中的一些思考。本文通过实例代码给大家介绍的非常详细,需要的朋友参看下吧
    2019-10-10
  • Datawhale练习之二手车价格预测

    Datawhale练习之二手车价格预测

    此篇文章是关于Datawhale练习,代码完整,但由于该数据集中数据特征较少(39维),以下可作为少量特征情况下的分析。当特征数目过大(成千上万)时,需要继续学习。需要的朋友可以参考下
    2021-04-04
  • python私有属性和方法实例分析

    python私有属性和方法实例分析

    这篇文章主要介绍了python私有属性和方法的用法,实例分析了python私有属性和方法的原理及具体使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-01-01
  • 基于Python实现开发钉钉通知机器人

    基于Python实现开发钉钉通知机器人

    在项目协同工作或自动化流程完成时,我们需要用一定的手段通知自己或他人。Telegram 非常好用,几个步骤就能创建一个机器人,可惜在国内无法使用。所以本文就来开发一个钉钉通知机器人吧
    2023-02-02
  • 详解Python中的数据清洗工具flashtext

    详解Python中的数据清洗工具flashtext

    FlashText是GitHub上的一个开源Python库,正如之前所提到的,它在提取关键字和替换关键字任务上有着极高的性能。本文将详解一下flashtext的使用,需要的可以参考一下
    2022-06-06

最新评论