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中mechanize库的简单使用示例
Jan 10 Python
Python中集合的内建函数和内建方法学习教程
Aug 19 Python
python字符类型的一些方法小结
May 16 Python
python使用mysql数据库示例代码
May 21 Python
Python序列循环移位的3种方法推荐
Apr 09 Python
python 判断参数为Nonetype类型或空的实例
Oct 30 Python
python实现将汉字保存成文本的方法
Nov 16 Python
Python设计模式之抽象工厂模式原理与用法详解
Jan 15 Python
python实现给微信指定好友定时发送消息
Apr 29 Python
python 如何去除字符串头尾的多余符号
Nov 19 Python
python程序文件扩展名知识点详解
Feb 27 Python
keras load model时出现Missing Layer错误的解决方式
Jun 11 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使用内置dir类实现目录遍历删除
2015/03/31 PHP
常用的php图片处理类(水印、等比缩放、固定高宽)分享
2015/06/19 PHP
multiSteps 基于Jquery的多步骤滑动切换插件
2011/07/22 Javascript
jQuery验证Checkbox是否选中的代码 推荐
2011/09/04 Javascript
JavaScript与DOM组合动态创建表格实例
2012/12/23 Javascript
Nodejs极简入门教程(三):进程
2014/10/27 NodeJs
JS中dom0级事件和dom2级事件的区别介绍
2016/05/05 Javascript
AngularJS基础 ng-selected 指令简单示例
2016/08/03 Javascript
ES6中Math对象新增的方法实例详解
2017/04/25 Javascript
jquery 通过ajax请求获取后台数据显示在表格上的方法
2018/08/08 jQuery
Angular动画实现的2种方式以及添加购物车动画实例代码
2018/08/09 Javascript
Element-UI踩坑之Pagination组件的使用
2018/10/29 Javascript
webpack4+express+mongodb+vue实现增删改查的示例
2018/11/08 Javascript
使用nvm和nrm优化node.js工作流的方法
2019/01/17 Javascript
Vue watch响应数据实现方法解析
2020/07/10 Javascript
vue+element使用动态加载路由方式实现三级菜单页面显示的操作
2020/08/04 Javascript
Vue使用轮询定时发送请求代码
2020/08/10 Javascript
Vue + ts实现轮播插件的示例
2020/11/10 Javascript
python实现用户登陆邮件通知的方法
2015/07/09 Python
教你用python3根据关键词爬取百度百科的内容
2016/08/18 Python
python 异常处理总结
2016/10/18 Python
python pandas dataframe 行列选择,切片操作方法
2018/04/10 Python
Django中的Model操作表的实现
2018/07/24 Python
pytorch GAN伪造手写体mnist数据集方式
2020/01/10 Python
python爬虫开发之urllib模块详细使用方法与实例全解
2020/03/09 Python
波兰补充商店:Muscle Power
2018/10/29 全球购物
C#和SQL Server的面试题
2016/08/12 面试题
学期自我评价
2014/01/27 职场文书
运动会解说词100字
2014/01/31 职场文书
八一慰问活动方案
2014/02/07 职场文书
优秀的导游求职信范文
2014/04/06 职场文书
单位委托书
2014/10/15 职场文书
初中中等生评语
2014/12/29 职场文书
综合实践活动报告
2015/02/05 职场文书
办公室主任岗位职责范本
2015/03/31 职场文书
初中语文教学随笔
2015/08/15 职场文书