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学习笔记 下载
Feb 10 Python
Python函数嵌套实例
Sep 23 Python
Python中的高级函数map/reduce使用实例
Apr 13 Python
在Django中创建动态视图的教程
Jul 15 Python
python删除服务器文件代码示例
Feb 09 Python
tensorflow学习笔记之简单的神经网络训练和测试
Apr 15 Python
解决pycharm每次新建项目都要重新安装一些第三方库的问题
Jan 17 Python
Python3.5字符串常用操作实例详解
May 01 Python
Python input函数使用实例解析
Nov 22 Python
解决Pycharm 运行后没有输出的问题
Feb 05 Python
Pygame Event事件模块的详细示例
Nov 17 Python
Python tensorflow卷积神经Inception V3网络结构
May 06 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设计模式  Command(命令模式)
2011/06/17 PHP
php中unlink()、mkdir()、rmdir()等方法的使用介绍
2012/12/21 PHP
解析mysql 表中的碎片产生原因以及清理
2013/06/22 PHP
php返回json数据函数实例
2014/10/09 PHP
php根据一个给定范围和步进生成数组的方法
2015/06/19 PHP
部署PHP时的4个配置修改说明
2015/10/19 PHP
PHP中类属性与类静态变量的访问方法示例
2016/07/13 PHP
PHP数组操作简单案例分析
2016/10/15 PHP
Laravel 验证码认证学习记录小结
2019/12/20 PHP
jQuery的实现原理的模拟代码 -1 核心部分
2010/08/01 Javascript
关于Javascript模块化和命名空间管理的问题说明
2010/12/06 Javascript
在图片上显示左右箭头类似翻页的代码
2013/03/04 Javascript
JS获取select的value和text值的简单实例
2014/02/26 Javascript
js图片预加载示例
2014/04/30 Javascript
javascript 应用小技巧方法汇总
2015/07/05 Javascript
Boostrap模态窗口的学习小结
2016/03/28 Javascript
DOM操作和jQuery实现选项移动操作的简单实例
2016/06/07 Javascript
NodeJS实现客户端js加密
2017/01/09 NodeJs
ECMAScript6变量的解构赋值实例详解
2017/09/19 Javascript
jQuery选择器之表单元素选择器详解
2017/09/19 jQuery
总结JavaScript在IE9之前版本中内存泄露问题
2018/04/28 Javascript
JS简易计算器实例讲解
2020/06/30 Javascript
js正则表达式简单校验方法
2021/01/03 Javascript
python绘制铅球的运行轨迹代码分享
2017/11/14 Python
Python Web程序部署到Ubuntu服务器上的方法
2018/02/22 Python
深入浅析Python获取对象信息的函数type()、isinstance()、dir()
2018/09/17 Python
webapp字号大小跟随系统字号大小缩放的示例代码
2018/12/26 HTML / CSS
HTML5 视频播放(video),JavaScript控制视频的实例代码
2018/10/08 HTML / CSS
盖尔斯工厂店:GUESS Factory
2020/01/21 全球购物
中学生团员自我评价分享
2013/12/07 职场文书
机械工程学院大学生求职信
2014/05/25 职场文书
音乐之声音乐广播稿
2014/09/10 职场文书
机关领导干部作风整顿整改措施
2014/09/19 职场文书
运动会宣传稿100字
2015/07/23 职场文书
女方家长婚礼致辞
2015/07/27 职场文书
Python函数中的不定长参数相关知识总结
2021/06/24 Python