django框架事务处理小结【ORM 事务及raw sql,customize sql 事务处理】


Posted in Python onJune 27, 2019

本文实例讲述了django框架事务处理。分享给大家供大家参考,具体如下:

django 中要求事务处理的情况有两种:

1.基于django orM 的 transaction 处理

2.是基于自定义SQL 语句的transaction的处理,通常是比较复杂的SQL ,用ORM 处理不方便的时候用的。或者是大批量SQL语句执行,比较在意效率的情况下用。

首先说一下第二种情况,因为这种情况相对简单一点,没ORM 那么多东西,用我写的一个方法来解释

from django.db import connection, transaction
.....
def batch_execsql(sqlarray):
  cursor = connection.cursor() # 得到处理的游标对象
  ret=""
  try:
    for sql in sqlarray:
      cursor.execute(sql)
    transaction.commit_unless_managed() # 这是重点,没有这条语句,就不会commit 。
  except Exception,e: #简单的异常处理,可以忽略
    ret=str(e)
  cursor.close()
  return ret #有异常则返回异常,否则返回为空字符串

由上面可以看出 transaction.commit_unless_managed()的重要性,这是自定义SQL 语句情况下处理事务的方法. 上面的例子中的 sqlarray 表示一个list,里面有很多自己写的SQL 语句,而这些语句要求在一个事务中完成。

再来看看第一种情况,用ORM 的时候,事务的处理. 这在django 的官方文档中有说明,下面简单翻译介绍下

1. django 默认的事务, 是自动处理的,当你在调用 orM 的model.save(),model.delete()的时候,所有改动会被立即提交的,相当于数据库设置了auto commit,没有隐藏的rollback.

2.对http请求的事务拦截,这是推荐的方式,使用了transaction中间件来完成,这是比较好的方法,但必须在settings.py中配置.

MIDDLEWARE_CLASSES = (
  'django.middleware.cache.UpdateCacheMiddleware',
  'django.contrib.sessions.middleware.SessionMiddleware',
  'django.middleware.common.CommonMiddleware',
  'django.middleware.transaction.TransactionMiddleware',
  'django.middleware.cache.FetchFromCacheMiddleware',
)

但需要注意的是,这样配置之后,与你中间件的配置顺序是有很大关系的。在 TransactionMiddleware 之后的所有中间件都会受到事务的控制。所以当你把session 中间件放到 Transaction之后,同样会受到影响。但  CacheMiddleware, UpdateCacheMiddleware, and FetchFromCacheMiddleware  不会受到影响,cache机制有自己的处理方式,用了内部的connection来处理

另外 TransactionMiddleware 只对 default 的数据库配置有效,如果要对另外的数据连接用这种方式,必须自己实现中间件。

3.自己来控制事务,这种情况下,你自己灵活控制事务.在settings.py 中不用配置 TransactionMiddleware 中间件了, 基本采用装饰模式来实现。

a) @transaction.autocommit ,django默认的事务处理, 采用此装饰模式会忽略掉全局的transaction 设置

from django.db import transaction
@transaction.autocommit
def viewfunc(request):
  ....
@transaction.autocommit(using="my_other_database")
def viewfunc2(request):
  ....

b) @transaction.commit_on_success 在一个方法中,所有工作完成后,提交事务。

from django.db import transaction
@transaction.commit_on_success
def viewfunc(request):
  ....
@transaction.commit_on_success(using="my_other_database")
def viewfunc2(request):
  ....

c) commit_manually() ,完全自己处理,但如果你没有调用commit()或者rollback(),将会抛出TransactionManagementError 异常.

from django.db import transaction
@transaction.commit_manually
def viewfunc(request):
  ...
  # You can commit/rollback however and whenever you want
  transaction.commit()
  ...
  # But you've got to remember to do it yourself!
  try:
    ...
  except:
    transaction.rollback()
  else:
    transaction.commit()
@transaction.commit_manually(using="my_other_database")
def viewfunc2(request):
  ....

希望本文所述对大家基于Django框架的Python程序设计有所帮助。

Python 相关文章推荐
Python 3.x读写csv文件中数字的方法示例
Aug 29 Python
使用python编写udp协议的ping程序方法
Apr 22 Python
在PyCharm环境中使用Jupyter Notebook的两种方法总结
May 24 Python
pyqt5与matplotlib的完美结合实例
Jun 21 Python
Python获取时间范围内日期列表和周列表的函数
Aug 05 Python
Python @property使用方法解析
Sep 17 Python
Python 函数绘图及函数图像微分与积分
Nov 20 Python
python中图像通道分离与合并实例
Jan 17 Python
python json 递归打印所有json子节点信息的例子
Feb 27 Python
Pytorch 卷积中的 Input Shape用法
Jun 29 Python
keras实现VGG16 CIFAR10数据集方式
Jul 07 Python
Python高并发和多线程有什么关系
Nov 14 Python
python pytest进阶之conftest.py详解
Jun 27 #Python
详解Python 多线程 Timer定时器/延迟执行、Event事件
Jun 27 #Python
python pytest进阶之fixture详解
Jun 27 #Python
解决pycharm 远程调试 上传 helpers 卡住的问题
Jun 27 #Python
python中pytest收集用例规则与运行指定用例详解
Jun 27 #Python
python取余运算符知识点详解
Jun 27 #Python
如何运行.ipynb文件的图文讲解
Jun 27 #Python
You might like
分享PHP计算两个日期相差天数的代码
2015/12/23 PHP
php实现的二叉树遍历算法示例
2017/06/15 PHP
laravel 实现设置时区的简单方法
2019/10/10 PHP
Laravel中如何轻松容易的输出完整的SQL语句
2020/07/26 PHP
JavaScript 基础问答三
2008/12/03 Javascript
jquery 学习笔记 传智博客佟老师附详细注释
2020/09/12 Javascript
jQuery学习基础知识小结
2010/11/25 Javascript
js图片自动轮播代码分享(js图片轮播)
2014/05/06 Javascript
用javascript关闭本窗口技巧小结
2014/09/05 Javascript
微信小程序 wx:key详细介绍
2016/10/28 Javascript
js实现tab选项卡切换功能
2017/01/13 Javascript
JavaScript函数节流和函数防抖之间的区别
2017/02/15 Javascript
JS实现图片预加载之无序预加载功能代码
2017/05/12 Javascript
深入探究AngularJs之$scope对象(作用域)
2017/07/20 Javascript
详解vue-property-decorator使用手册
2019/07/29 Javascript
vue 实现单选框设置默认选中值
2019/11/07 Javascript
ES6函数和数组用法实例分析
2020/05/23 Javascript
Antd的Table组件嵌套Table以及选择框联动操作
2020/10/24 Javascript
python处理html转义字符的方法详解
2016/07/01 Python
Python创建普通菜单示例【基于win32ui模块】
2018/05/09 Python
使用python实现抓取腾讯视频所有电影的爬虫
2019/04/15 Python
python使用Matplotlib改变坐标轴的默认位置
2019/10/18 Python
python二维键值数组生成转json的例子
2019/12/06 Python
python目标检测给图画框,bbox画到图上并保存案例
2020/03/10 Python
Python3-异步进程回调函数(callback())介绍
2020/05/02 Python
python 从list中随机取值的方法
2020/11/16 Python
python爬虫快速响应服务器的做法
2020/11/24 Python
html5构建触屏网站之touch事件介绍
2013/01/07 HTML / CSS
HTML5新增元素如何兼容旧浏览器有哪些方法
2014/05/09 HTML / CSS
Clarisonic美国官网:科莱丽声波洁面仪
2017/10/12 全球购物
Eagle Eyes Optics鹰眼光学:高性能太阳镜
2018/12/07 全球购物
日本最大化妆品和美容产品的综合口碑网站:cosme shopping
2019/08/28 全球购物
教育学专业毕业生的自我鉴定
2013/11/26 职场文书
幼儿园安全责任书
2014/04/14 职场文书
企业百日安全活动总结
2015/05/07 职场文书
Vue过滤器(filter)实现及应用场景详解
2021/06/15 Vue.js