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查找指定具有相同内容文件的方法
Jun 28 Python
Python多线程下载文件的方法
Jul 10 Python
python3中dict(字典)的使用方法示例
Mar 22 Python
Python实现简单遗传算法(SGA)
Jan 29 Python
python实现五子棋小游戏
Mar 25 Python
分析经典Python开发工程师面试题
Apr 08 Python
python3.6使用tkinter实现弹跳小球游戏
May 09 Python
Django  ORM 练习题及答案
Jul 19 Python
Python 保持登录状态进行接口测试的方法示例
Aug 06 Python
基于Python的图像数据增强Data Augmentation解析
Aug 13 Python
Django 批量插入数据的实现方法
Jan 12 Python
django 链接多个数据库 并使用原生sql实现
Mar 28 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之第四天
2006/10/09 PHP
PHPMYADMIN导入数据最大为2M的解决方法
2012/04/23 PHP
PHP与Java进行通信的实现方法
2013/10/21 PHP
深入剖析PHP中printf()函数格式化使用
2016/05/23 PHP
js编码之encodeURIComponent使用介绍(asp,php)
2012/03/01 Javascript
原生javascript实现的分页插件pagenav
2014/08/28 Javascript
jquery滚动加载数据的方法
2015/03/09 Javascript
javascript实现Email邮件显示与删除功能
2015/11/21 Javascript
jQuery自动完成插件completer附源码下载
2016/01/04 Javascript
javascript的document中的动态添加标签实现方法
2016/10/24 Javascript
js实现贪吃蛇小游戏(容易理解)
2017/01/22 Javascript
微信小程序开发之map地图实现教程
2017/06/08 Javascript
SelectPage v2.4 发布新增纯下拉列表和关闭分页功能
2017/09/07 Javascript
React服务端渲染原理解析与实践
2021/03/04 Javascript
[50:04]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第二局
2016/02/28 DOTA
[06:15]2016国际邀请赛中国区预选赛单车采访:我顶WINGS
2016/06/27 DOTA
python标准日志模块logging的使用方法
2013/11/01 Python
python写入中英文字符串到文件的方法
2015/05/06 Python
python函数形参用法实例分析
2015/08/04 Python
Python处理PDF及生成多层PDF实例代码
2017/04/24 Python
Python使用OpenCV进行标定
2018/05/08 Python
对python读取zip压缩文件里面的csv数据实例详解
2019/02/08 Python
深入理解Tensorflow中的masking和padding
2020/02/24 Python
video结合canvas实现视频在线截图功能
2018/06/25 HTML / CSS
H5离线存储Manifest原理及使用
2020/04/28 HTML / CSS
HTML5 body设置自适应全屏
2020/05/07 HTML / CSS
时装界的“朋克之母”:Vivienne Westwood
2017/07/06 全球购物
品牌宣传方案
2014/03/21 职场文书
葬礼司仪主持词
2014/03/31 职场文书
学生夜不归宿检讨书
2014/09/23 职场文书
2014年小学语文工作总结
2014/12/20 职场文书
新郎婚礼答谢词
2015/01/04 职场文书
公司食堂管理制度
2015/08/05 职场文书
2019年度政务公开考核工作总结模板
2019/11/11 职场文书
Python实现智慧校园自动评教全新版
2021/06/18 Python
python编程项目中线上问题排查与解决
2021/11/01 Python