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中as用法实例分析
Apr 30 Python
Python操作串口的方法
Jun 17 Python
开源Web应用框架Django图文教程
Mar 09 Python
简单了解什么是神经网络
Dec 23 Python
pandas 实现将重复表格去重,并重新转换为表格的方法
Apr 18 Python
Python3.6笔记之将程序运行结果输出到文件的方法
Apr 22 Python
python 重定向获取真实url的方法
May 11 Python
Python3.5模块的定义、导入、优化操作图文详解
Apr 27 Python
Python使用type关键字创建类步骤详解
Jul 23 Python
Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)
Dec 04 Python
使用TensorFlow-Slim进行图像分类的实现
Dec 31 Python
django上传文件的三种方式
Apr 29 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 ci框架验证码实例分析
2013/06/26 PHP
微信公众号开发之文本消息自动回复php代码
2016/08/08 PHP
laravel框架如何设置公共头和公共尾
2019/10/22 PHP
js 实现复制到粘贴板的功能代码
2010/05/13 Javascript
一个不错的字符串转码解码函数(自写)
2014/07/31 Javascript
jQuery on方法传递参数示例
2014/12/09 Javascript
jquery实现炫酷的叠加层自动切换特效
2015/02/01 Javascript
javascript跨域方法、原理以及出现问题解决方法(详解)
2015/08/06 Javascript
JS实现带有抽屉效果的产品类网站多级导航菜单代码
2015/09/15 Javascript
javascript实现unicode与ASCII相互转换的方法
2015/12/10 Javascript
DOM中事件处理概览与原理的全面解析
2016/08/16 Javascript
xtemplate node.js 的使用方法实例解析
2016/08/22 Javascript
node+experss实现爬取电影天堂爬虫
2016/11/20 Javascript
jQuery实现的checkbox级联选择下拉菜单效果示例
2016/12/26 Javascript
nodejs获取微信小程序带参数二维码实现代码
2017/04/12 NodeJs
让div运动起来 js实现缓动效果
2017/07/06 Javascript
angular.extend方法的具体使用
2017/09/14 Javascript
bootstrap实现二级下拉菜单效果
2017/11/23 Javascript
微信小程序顶部导航栏滑动tab效果
2019/01/28 Javascript
Vue动态生成el-checkbox点击无法赋值的解决方法
2019/02/21 Javascript
Node.js 实现远程桌面监控的方法步骤
2019/07/02 Javascript
Vue中父子组件的值传递与方法传递
2020/09/28 Javascript
[03:17]2014DOTA2 国际邀请赛中国区预选赛 四强专访
2014/05/23 DOTA
python实现上传下载文件功能
2020/11/19 Python
Python2.7下安装Scrapy框架步骤教程
2017/12/22 Python
面向初学者的Python编辑器Mu
2018/10/08 Python
python 抓包保存为pcap文件并解析的实例
2019/07/23 Python
详解使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件
2019/08/23 Python
解决pycharm上的jupyter notebook端口被占用问题
2019/12/17 Python
使用python无账号无限制获取企查查信息的实例代码
2020/04/17 Python
Tensorflow中k.gradients()和tf.stop_gradient()用法说明
2020/06/10 Python
一款利用纯css3实现的360度翻转按钮的实例教程
2014/11/05 HTML / CSS
使用html2canvas将页面转成图并使用用canvas2image下载
2019/04/04 HTML / CSS
经济实惠的豪华背包和行李袋:Packs Project
2018/10/17 全球购物
北京泡泡网网络有限公司.net面试题
2012/07/17 面试题
Python的代理类实现,控制访问和修改属性的权限你都了解吗
2022/03/21 Python