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 相关文章推荐
django认证系统实现自定义权限管理的方法
Jul 16 Python
使用pip发布Python程序的方法步骤
Oct 11 Python
Python3.5 + sklearn利用SVM自动识别字母验证码方法示例
May 10 Python
python科学计算之narray对象用法
Nov 25 Python
基于python调用psutil模块过程解析
Dec 20 Python
简单了解Django ORM常用字段类型及参数配置
Jan 07 Python
Python 2种方法求某个范围内的所有素数(质数)
Jan 31 Python
python 命名规范知识点汇总
Feb 14 Python
基于Python fminunc 的替代方法
Feb 29 Python
django实现将修改好的新模型写入数据库
Mar 31 Python
Python制作一个仿QQ办公版的图形登录界面
Sep 22 Python
Python实现提取PDF简历信息并存入Excel
Apr 02 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 cli模式学习(PHP命令行模式)
2013/06/03 PHP
解析php中curl_multi的应用
2013/07/17 PHP
php中convert_uuencode()与convert_uuencode函数用法实例
2014/11/22 PHP
[原创]php实现子字符串位置相互对调互换的方法
2016/06/02 PHP
PHP实现删除多重数组对象属性并重新赋值的方法
2017/06/07 PHP
php-app开发接口加密详解
2018/04/18 PHP
javascript学习笔记(十二) RegExp类型介绍
2012/06/20 Javascript
jquery点击页面任何区域实现鼠标焦点十字效果
2013/06/21 Javascript
JavaScript中的关键字"VAR"使用详解 分享
2013/07/31 Javascript
js获取微信版本号的方法
2015/05/12 Javascript
基于JavaScript实现高德地图和百度地图提取行政区边界经纬度坐标
2016/01/22 Javascript
javascript结合Flexbox简单实现滑动拼图游戏
2016/02/18 Javascript
javascript判断firebug是否开启的方法
2016/11/23 Javascript
Javascript中call,apply,bind方法的详解与总结
2016/12/12 Javascript
angularJS模态框$modal实例代码
2017/05/27 Javascript
在bootstrap中实现轮播图实例代码
2017/06/11 Javascript
基于jQuery的左滑出现删除按钮的示例
2017/08/29 jQuery
vue.js 中使用(...)运算符报错的解决方法
2018/08/09 Javascript
JS 验证码功能的三种实现方式
2018/11/26 Javascript
Vue动态生成表格的行和列
2019/07/18 Javascript
python通过exifread模块获得图片exif信息的方法
2015/03/16 Python
Python列出一个文件夹及其子目录的所有文件
2016/06/30 Python
matplotlib.pyplot绘图显示控制方法
2019/01/15 Python
python实现图片转字符小工具
2019/04/30 Python
python basemap 画出经纬度并标定的实例
2019/07/09 Python
python 判断字符串中是否含有汉字或非汉字的实例
2019/07/15 Python
Tensorflow tf.nn.depthwise_conv2d如何实现深度卷积的
2020/04/20 Python
使用pytorch实现论文中的unet网络
2020/06/24 Python
HTML5 Canvas中使用用路径描画圆弧
2015/01/01 HTML / CSS
丝芙兰巴西官方商城:SEPHORA巴西
2016/10/31 全球购物
美国克罗格超市在线购物:Kroger
2019/06/21 全球购物
行政助理的岗位职责
2014/02/18 职场文书
《我为你骄傲》教学反思
2014/02/20 职场文书
大学生社会实践方案
2014/05/11 职场文书
新闻编辑求职信
2014/07/13 职场文书
Netty结合Protobuf进行编解码的方法
2021/06/26 Java/Android