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 相关文章推荐
python通过BF算法实现关键词匹配的方法
Mar 13 Python
使用Python脚本将Bing的每日图片作为桌面的教程
May 04 Python
python绘图方法实例入门
May 19 Python
详解Python的Django框架中的模版继承
Jul 16 Python
Python实现的求解最小公倍数算法示例
May 03 Python
通过shell+python实现企业微信预警
Mar 07 Python
树莓派采用socket方式文件传输(python)
Jun 22 Python
django框架模板中定义变量(set variable in django template)的方法分析
Jun 24 Python
利用Python小工具实现3秒钟将视频转换为音频
Oct 29 Python
python中的数组赋值与拷贝的区别详解
Nov 26 Python
Python通过字典映射函数实现switch
Nov 06 Python
基于Python 函数和方法的区别说明
Mar 24 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 简易输出CSV表格文件的方法详解
2013/06/20 PHP
PHP常用技术文之文件操作和目录操作总结
2014/09/27 PHP
使用AngularJS和PHP的Laravel实现单页评论的方法
2015/06/19 Javascript
学习JavaScript图片预加载模块
2016/11/07 Javascript
html中鼠标滚轮事件onmousewheel的处理方法
2016/11/11 Javascript
基于Marquee.js插件实现的跑马灯效果示例
2017/01/25 Javascript
JavaScript 网页中实现一个计算当年还剩多少时间的倒数计时程序
2017/01/25 Javascript
详解Node.js 命令行程序开发教程
2017/06/07 Javascript
vue.js实例对象+组件树的详细介绍
2017/10/20 Javascript
微信小程序-getUserInfo回调的实例详解
2017/10/27 Javascript
Vue ElementUi同时校验多个表单(巧用new promise)
2018/06/06 Javascript
对angularjs框架下controller间的传值方法详解
2018/10/08 Javascript
NodeJS 将文件夹按照存放路径变成一个对应的JSON的方法
2018/10/17 NodeJs
layui当点击文本框时弹出选择框,显示选择内容的例子
2019/09/02 Javascript
[00:39]DOTA2上海特级锦标赛 Liquid战队宣传片
2016/03/04 DOTA
简单的编程0基础下Python入门指引
2015/04/01 Python
关于反爬虫的一些简单总结
2017/12/13 Python
python内置数据类型之列表操作
2018/11/12 Python
python-itchat 获取微信群用户信息的实例
2019/02/21 Python
python模拟菜刀反弹shell绕过限制【推荐】
2019/06/25 Python
解决pycharm remote deployment 配置的问题
2019/06/27 Python
python 利用turtle模块画出没有角的方格
2019/11/23 Python
在Mac中配置Python虚拟环境过程解析
2020/06/22 Python
Python实现异步IO的示例
2020/11/05 Python
Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
2021/03/03 Python
Dillard’s百货官网:Dillards.com
2018/05/26 全球购物
英国奢侈皮具品牌:Aspinal of London
2018/09/02 全球购物
网络教育毕业生自我鉴定
2013/10/10 职场文书
数学国培研修感言
2014/02/13 职场文书
初中毕业生的自我评价
2014/03/03 职场文书
小学教师培训方案
2014/06/09 职场文书
电子专业求职信
2014/06/19 职场文书
小学校长汇报材料
2014/08/20 职场文书
2015年元旦联欢晚会活动总结
2014/11/28 职场文书
升学宴学生答谢词
2015/01/05 职场文书
python实现学员管理系统(面向对象版)
2022/06/05 Python