python django事务transaction源码分析详解


Posted in Python onMarch 17, 2017

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 相关文章推荐
教你如何在Django 1.6中正确使用 Signal
Jun 22 Python
连接Python程序与MySQL的教程
Apr 29 Python
详细解析Python中__init__()方法的高级应用
May 11 Python
用python写的一个wordpress的采集程序
Feb 27 Python
Python编写一个优美的下载器
Apr 15 Python
Anaconda2下实现Python2.7和Python3.5的共存方法
Jun 11 Python
Python玩转加密的技巧【推荐】
May 13 Python
Django框架模板的使用方法示例
May 25 Python
如何用Python破解wifi密码过程详解
Jul 12 Python
ubuntu上安装python的实例方法
Sep 30 Python
基于python-pptx库中文文档及使用详解
Feb 14 Python
浅谈python3打包与拆包在函数的应用详解
May 02 Python
Python自动生产表情包
Mar 17 #Python
Python实现的异步代理爬虫及代理池
Mar 17 #Python
Python 专题一 函数的基础知识
Mar 16 #Python
python 专题九 Mysql数据库编程基础知识
Mar 16 #Python
Python实现树莓派WiFi断线自动重连的实例代码
Mar 16 #Python
Windows下安装python MySQLdb遇到的问题及解决方法
Mar 16 #Python
python Selenium爬取内容并存储至MySQL数据库的实现代码
Mar 16 #Python
You might like
使用php+Ajax实现唯一校验实现代码[简单应用]
2011/11/29 PHP
基于python发送邮件的乱码问题的解决办法
2013/04/25 PHP
Yii调试SQL的常用方法
2014/07/09 PHP
php中strtotime函数用法详解
2014/11/15 PHP
基于GD2图形库的PHP生成图片缩略图类代码分享
2015/02/08 PHP
Laravel中encrypt和decrypt的实现方法
2017/09/24 PHP
PHP递归统计系统中代码行数
2019/09/19 PHP
TNC vs BOOM BO3 第二场2.13
2021/03/10 DOTA
jquery限制输入字数,并提示剩余字数实现代码
2012/12/24 Javascript
JS关闭窗口或JS关闭页面的几种代码分享
2013/10/25 Javascript
jQuery Mobile漏洞会有跨站脚本攻击风险
2017/02/12 Javascript
浅谈原生JS实现jQuery的animate()动画示例
2017/03/08 Javascript
使用jQuery实现购物车结算功能
2017/08/15 jQuery
jQuery实现输入框的放大和缩小功能示例
2018/07/21 jQuery
微信小程序使用wxParse解析html的方法示例
2019/01/17 Javascript
JS实现贪吃蛇游戏
2019/11/15 Javascript
jdk1.8+vue elementui实现多级菜单功能
2020/09/24 Javascript
python中的sort方法使用详解
2014/07/25 Python
Python中遇到的小问题及解决方法汇总
2017/01/11 Python
python 把文件中的每一行以数组的元素放入数组中的方法
2018/04/29 Python
python函数声明和调用定义及原理详解
2019/12/02 Python
python 解压、复制、删除 文件的实例代码
2020/02/26 Python
python上下文管理的使用场景实例讲解
2021/03/03 Python
《灯光》教学反思
2014/02/08 职场文书
有多年工作经验的自我评价
2014/03/02 职场文书
2014年教师节国旗下讲话稿
2014/09/10 职场文书
刑事辩护授权委托书
2014/09/13 职场文书
2015关爱留守儿童工作总结
2014/12/12 职场文书
贫困生助学金感谢信
2015/01/21 职场文书
报名委托书
2015/01/29 职场文书
继续教育心得体会(共6篇)
2016/01/19 职场文书
2016机关干部作风建设心得体会
2016/01/21 职场文书
2016年先进教师个人事迹材料
2016/02/26 职场文书
看古人们是如何赞美老师的?
2019/07/08 职场文书
二手手机买卖合同范本(2019年版)
2019/10/28 职场文书
一级电子管军用接收机测评
2022/04/05 无线电