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实现子类调用父类的方法
Nov 10 Python
轻松掌握python设计模式之访问者模式
Nov 18 Python
Python深入06——python的内存管理详解
Dec 07 Python
python实现神经网络感知器算法
Dec 20 Python
Python 找到列表中满足某些条件的元素方法
Jun 26 Python
python numpy 一维数组转变为多维数组的实例
Jul 02 Python
浅谈python连续赋值可能引发的错误
Nov 10 Python
Python 获取windows桌面路径的5种方法小结
Jul 15 Python
python 采用paramiko 远程执行命令及报错解决
Oct 21 Python
Django ORM 查询表中某列字段值的方法
Apr 30 Python
keras:model.compile损失函数的用法
Jul 01 Python
详解vscode实现远程linux服务器上Python开发
Nov 10 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函数utf8转gb2312编码
2006/12/21 PHP
微博短链接算法php版本实现代码
2012/09/15 PHP
基于PHP导出Excel的小经验 完美解决乱码问题
2013/06/10 PHP
php准确获取文件MIME类型的方法
2015/06/17 PHP
javascript css float属性的特殊写法
2008/11/13 Javascript
基于jQuery实现下拉收缩(展开与折叠)特效
2012/12/25 Javascript
Javascript对象属性方法汇总
2013/11/21 Javascript
jquery中load方法的用法及注意事项说明
2014/02/22 Javascript
js+cookies实现悬浮购物车的方法
2015/05/25 Javascript
jquery对复选框(checkbox)的操作汇总
2016/01/13 Javascript
两种JavaScript的AES加密方式(可与Java相互加解密)
2016/08/02 Javascript
Ajax使用原生态JS验证用户名是否存在
2020/05/26 Javascript
js 打开新页面在屏幕中间的实现方法
2016/11/02 Javascript
jQuery、zepto、js常用小技巧
2017/02/12 Javascript
使用JavaScript实现一个小程序之99乘法表
2017/09/21 Javascript
Nodejs实现文件上传的示例代码
2017/09/26 NodeJs
javascript中关于类型判断的一些疑惑小结
2018/10/14 Javascript
使用layui的router来进行传参的实现方法
2019/09/06 Javascript
手把手带你搭建一个node cli的方法示例
2020/08/07 Javascript
js实现三角形粒子运动
2020/09/22 Javascript
Python实现删除列表中满足一定条件的元素示例
2017/06/12 Python
《与孩子一起学编程》python自测题
2018/05/27 Python
python实现超市扫码仪计费
2018/05/30 Python
浅谈python中统计计数的几种方法和Counter详解
2019/11/07 Python
canvas绘制文本内容自动换行的实现代码
2019/01/14 HTML / CSS
canvas生成带二维码海报的踩坑记录
2019/09/11 HTML / CSS
美国女孩服装购物网站:Justice
2017/03/04 全球购物
环境科学专业大学生自荐信格式
2013/09/21 职场文书
中医药大学毕业生自荐信
2013/11/08 职场文书
演讲主持词
2014/03/18 职场文书
研究生导师推荐信
2014/09/06 职场文书
领导干部遵守党的政治纪律情况思想汇报
2014/09/14 职场文书
群众路线教育实践活动对照检查材料思想汇报(副处级领导)
2014/10/04 职场文书
乡镇党员群众路线教育实践活动对照检查材料思想汇报
2014/10/05 职场文书
施工安全员岗位职责
2015/04/11 职场文书
详解Python生成器和基于生成器的协程
2021/06/03 Python