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中用pycurl监控http响应时间脚本分享
Feb 02 Python
python中requests模块的使用方法
Apr 08 Python
Python while、for、生成器、列表推导等语句的执行效率测试
Jun 03 Python
django实现支付宝支付实例讲解
Oct 17 Python
python logging添加filter教程
Dec 24 Python
TensorFlow——Checkpoint为模型添加检查点的实例
Jan 21 Python
Python tornado上传文件的功能
Mar 26 Python
Python 使用 PyQt5 开发的关机小工具分享
Jul 16 Python
Python不支持 i ++ 语法的原因解析
Jul 22 Python
Python3爬虫里关于识别微博宫格验证码的知识点详解
Jul 30 Python
python实现邮件循环自动发件功能
Sep 11 Python
python神经网络Xception模型
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
2019年中国咖啡业现状与发展趋势
2021/03/04 咖啡文化
解析PHP的session过期设置
2013/06/29 PHP
PHP生成等比缩略图类和自定义函数分享
2014/06/25 PHP
ThinkPHP通过AJAX返回JSON的两种实现方法
2014/12/18 PHP
php获取、检查类名、函数名、方法名的函数方法
2015/06/25 PHP
以文件形式缓存php变量的方法
2015/06/26 PHP
php微信高级接口群发 多客服
2016/06/23 PHP
Laravel框架Request、Response及Session操作示例
2019/05/06 PHP
JQuery解析HTML、JSON和XML实例详解
2014/03/29 Javascript
jQuery基于ajax实现星星评论代码
2015/08/07 Javascript
JS实现适合于后台使用的动画折叠菜单效果
2015/09/21 Javascript
基于JavaScript实现Tab选项卡切换效果
2016/11/24 Javascript
jQuery Validate验证框架详解(推荐)
2016/12/17 Javascript
JS按条件 serialize() 对应标签的使用方法
2017/07/24 Javascript
旺旺在线客服代码 旺旺客服代码生成器
2018/01/09 Javascript
vue实现路由监听和参数监听
2019/10/29 Javascript
vue3.0生命周期的示例代码
2020/09/24 Javascript
Python第三方库xlrd/xlwt的安装与读写Excel表格
2017/01/21 Python
Python操作使用MySQL数据库的实例代码
2017/05/25 Python
python 通过可变参数计算n个数的乘积方法
2019/06/13 Python
python 猴子补丁(monkey patch)
2019/06/26 Python
Python CVXOPT模块安装及使用解析
2019/08/01 Python
Django配置MySQL数据库的完整步骤
2019/09/07 Python
python写一个随机点名软件的实例
2019/11/28 Python
python中使用input()函数获取用户输入值方式
2020/05/03 Python
Python 生成短8位唯一id实战教程
2021/01/13 Python
Under Armour澳大利亚官网:美国知名的高端功能性运动品牌
2018/02/22 全球购物
新学期校长寄语
2014/01/18 职场文书
数控专业自荐书范文
2014/03/16 职场文书
继承公证书
2014/04/09 职场文书
扶贫办主任查摆“四风”问题个人对照检查材料思想汇报
2014/10/02 职场文书
保送生自荐信范文
2015/03/26 职场文书
情人节单身感言
2015/08/03 职场文书
《半截蜡烛》教学反思
2016/02/19 职场文书
用 Python 元类的特性实现 ORM 框架
2021/05/19 Python
mapstruct的用法之qualifiedByName示例详解
2022/04/06 Java/Android