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 16 Python
Python中的yield浅析
Jun 16 Python
Python最基本的输入输出详解
Apr 25 Python
python制作最美应用的爬虫
Oct 28 Python
python中函数默认值使用注意点详解
Jun 01 Python
详解python之协程gevent模块
Jun 14 Python
一百多行python代码实现抢票助手
Sep 25 Python
pytorch索引查找 index_select的例子
Aug 18 Python
使用apiDoc实现python接口文档编写
Nov 19 Python
Python监控服务器实用工具psutil使用解析
Dec 19 Python
python爬虫开发之Request模块从安装到详细使用方法与实例全解
Mar 09 Python
Django用户身份验证完成示例代码
Apr 03 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
从一个不错的留言本弄的mysql数据库操作类
2007/09/02 PHP
php适配器模式介绍
2012/08/14 PHP
PHP7安装Redis扩展教程【Linux与Windows平台】
2016/09/30 PHP
JS 实现Table相同行的单元格自动合并示例代码
2013/08/27 Javascript
招聘网站基于jQuery实现自动刷新简历
2015/05/10 Javascript
jquery中toggle函数交替使用问题
2015/06/22 Javascript
jquery实现浮动在网页右下角的彩票开奖公告窗口代码
2015/09/04 Javascript
javascript数据类型验证方法
2015/12/31 Javascript
JS检测移动端横竖屏的代码
2016/05/30 Javascript
js实现StringBuffer的简单实例
2016/09/02 Javascript
手机移动端实现 jquery和HTML5 Canvas的幸运大奖盘特效
2016/12/06 Javascript
微信小程序遇到修改数据后页面不渲染的问题解决
2017/03/09 Javascript
Vue.js在使用中的一些注意知识点
2017/04/29 Javascript
VuePress 静态网站生成方法步骤
2019/02/14 Javascript
layui递归实现动态左侧菜单
2019/07/26 Javascript
[37:29]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第二场 11.19
2020/11/19 DOTA
python通过字典dict判断指定键值是否存在的方法
2015/03/21 Python
python开启多个子进程并行运行的方法
2015/04/18 Python
使用Python编写一个在Linux下实现截图分享的脚本的教程
2015/04/24 Python
Python实现批量下载图片的方法
2015/07/08 Python
python基于pyDes库实现des加密的方法
2017/04/29 Python
Python实现字符串格式化输出的方法详解
2017/09/20 Python
Python数据分析:手把手教你用Pandas生成可视化图表的教程
2018/12/15 Python
使用python实现抓取腾讯视频所有电影的爬虫
2019/04/15 Python
关于python导入模块import与常见的模块详解
2019/08/28 Python
python实现画出e指数函数的图像
2019/11/21 Python
PYQT5开启多个线程和窗口,多线程与多窗口的交互实例
2019/12/13 Python
python pprint模块中print()和pprint()两者的区别
2020/02/10 Python
Keras设定GPU使用内存大小方式(Tensorflow backend)
2020/05/22 Python
澳大利亚首屈一指的鞋类品牌:Tony Bianco
2018/03/13 全球购物
Dockers鞋官网:Dockers Shoes
2018/11/13 全球购物
中学生运动会入场词
2014/02/12 职场文书
公司户外活动总结
2014/07/04 职场文书
特种设备安全管理制度
2015/08/06 职场文书
诺贝尔奖获得者名言100句:句句启人心智,值永久收藏
2019/08/09 职场文书
mongodb数据库迁移变更的解决方案
2021/09/04 MongoDB