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套接字流重定向实例汇总
Mar 03 Python
pandas系列之DataFrame 行列数据筛选实例
Apr 12 Python
python执行系统命令后获取返回值的几种方式集合
May 12 Python
python安装pywin32clipboard的操作方法
Jan 24 Python
python程序 线程队列queue使用方法解析
Sep 23 Python
python return逻辑判断表达式实现解析
Dec 02 Python
tensorflow入门:tfrecord 和tf.data.TFRecordDataset的使用
Jan 20 Python
Python学习之os模块及用法
Jun 03 Python
解决Python中导入自己写的类,被划红线,但不影响执行的问题
Jul 13 Python
解决redis与Python交互取出来的是bytes类型的问题
Jul 16 Python
python爬虫爬取某网站视频的示例代码
Feb 20 Python
关于Python使用turtle库画任意图的问题
Apr 01 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中strncmp()函数比较两个字符串前2个字符是否相等的方法
2016/01/07 PHP
php反射类ReflectionClass用法分析
2016/05/12 PHP
PHP 500报错的快速解决方法
2016/12/14 PHP
jQuery 源代码显示控件 (Ajax加载方式).
2009/05/18 Javascript
仅IE支持clearAttributes/mergeAttributes方法使用介绍
2012/05/04 Javascript
jQuery 拖动层(在可视区域范围内)
2012/05/24 Javascript
移动端点击态处理的三种实现方式
2017/01/12 Javascript
关于JS解构的5种有趣用法
2019/09/05 Javascript
JS桶排序的简单理解与实现方法示例
2019/11/25 Javascript
[16:14]教你分分钟做大人:米拉娜(HEROS)
2014/11/24 DOTA
python操作日期和时间的方法
2014/03/11 Python
python dict 字典 以及 赋值 引用的一些实例(详解)
2017/01/20 Python
浅谈Python中重载isinstance继承关系的问题
2018/05/04 Python
Windows下安装Scrapy
2018/10/17 Python
在cmder下安装ipython以及环境的搭建
2018/10/19 Python
使用Python批量修改文件名的代码实例
2019/01/24 Python
python3实现指定目录下文件sha256及文件大小统计
2019/02/25 Python
python字符串中匹配数字的正则表达式
2019/07/03 Python
Python + OpenCV 实现LBP特征提取的示例代码
2019/07/11 Python
使用Python实现文字转语音并生成wav文件的例子
2019/08/08 Python
pytorch 模型可视化的例子
2019/08/17 Python
python处理自动化任务之同时批量修改word里面的内容的方法
2019/08/23 Python
Python容器使用的5个技巧和2个误区总结
2019/09/26 Python
Python使用psutil获取进程信息的例子
2019/12/17 Python
Python编译成.so文件进行加密后调用的实现
2019/12/23 Python
Pycharm内置终端及远程SSH工具的使用教程图文详解
2020/03/19 Python
美国在线打印网站:Overnight Prints
2018/10/11 全球购物
WSDL的操作类型主要有几种
2013/07/19 面试题
市场专员岗位职责
2014/02/14 职场文书
中学校庆方案
2014/03/17 职场文书
大学生就业策划书范文
2014/04/04 职场文书
情况说明书格式范文
2014/05/06 职场文书
公司人事任命通知
2015/04/20 职场文书
蜗居观后感
2015/06/11 职场文书
django注册用邮箱发送验证码的实现
2021/04/18 Python
Windows 11上手初体验:任务栏和开始菜单等迎来大改
2021/11/21 数码科技