侯体宗的博客
  • 首页
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

python django事务transaction源码分析详解

Python  /  管理员 发布于 7年前   155

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安装cx_Oracle模块常见问题与解决方法
    下一条:
    Python自动生产表情包
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go语言中实现字符串可逆性压缩及解压缩功能(0个评论)
    • 使用go + gin + jwt + qrcode实现网站生成登录二维码在app中扫码登录功能(0个评论)
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客