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中writelines()方法的使用
May 25 Python
解决Python中字符串和数字拼接报错的方法
Oct 23 Python
Python3实现的判断环形链表算法示例
Mar 07 Python
解决python3中的requests解析中文页面出现乱码问题
Apr 19 Python
Python中单线程、多线程和多进程的效率对比实验实例
May 14 Python
python多线程同步之文件读写控制
Feb 25 Python
自定义实现 PyQt5 下拉复选框 ComboCheckBox的完整代码
Mar 30 Python
python 双循环遍历list 变量判断代码
May 04 Python
Python环境管理virtualenv&virtualenvwrapper的配置详解
Jul 01 Python
python实现图像外边界跟踪操作
Jul 13 Python
Flask中sqlalchemy模块的实例用法
Aug 02 Python
Python如何定义有默认参数的函数
Aug 10 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
Codeigniter整合Tank Auth权限类库详解
2014/06/12 PHP
PHP curl实现抓取302跳转后页面的示例
2014/07/04 PHP
PHP实现算式验证码和汉字验证码实例
2015/03/09 PHP
PHP查询附近的人及其距离的实现方法
2016/05/11 PHP
html5+javascript制作简易画板附图
2014/04/25 Javascript
jQuery 和 CSS 的文本特效插件集锦
2014/12/12 Javascript
Javascript实现div层渐隐效果的方法
2015/05/30 Javascript
jQuery切换所有复选框选中状态的方法
2015/07/02 Javascript
JS实现合并两个数组并去除重复项只留一个的方法
2015/12/17 Javascript
javascript基础知识分享之类与函数化
2016/02/13 Javascript
详解AngularJS过滤器的使用
2016/03/11 Javascript
jQuery中 $ 符号的冲突问题及解决方案
2016/11/04 Javascript
详解js中call与apply关键字的作用
2016/11/21 Javascript
JS中微信小程序自定义底部弹出框
2016/12/22 Javascript
nodejs实例解析(输出hello world)
2017/01/03 NodeJs
JS中如何实现Laravel的route函数详解
2017/02/12 Javascript
Vue.2.0.5过渡效果使用技巧
2017/03/16 Javascript
移动端手指放大缩小插件与js源码
2017/05/22 Javascript
node中的session的具体使用
2018/09/14 Javascript
vue实现倒计时获取验证码效果
2020/04/17 Javascript
微信小程序canvas截取任意形状的实现代码
2020/01/13 Javascript
JS实现图片幻灯片效果代码实例
2020/05/21 Javascript
微信小程序实现弹幕墙(祝福墙)
2020/11/18 Javascript
[09:37]2018DOTA2国际邀请赛寻真——不懈追梦的Team Serenity
2018/08/13 DOTA
django传值给模板, 再用JS接收并进行操作的实例
2018/05/28 Python
在python中使用with打开多个文件的方法
2019/01/07 Python
python导入模块交叉引用的方法
2019/01/19 Python
PyQT实现菜单中的复制,全选和清空的功能的方法
2019/06/17 Python
Python解决pip install时出现的Could not fetch URL问题
2019/08/01 Python
Python中的上下文管理器相关知识详解
2019/09/19 Python
Python socket聊天脚本代码实例
2020/01/02 Python
Python连接Hadoop数据中遇到的各种坑(汇总)
2020/04/14 Python
服装创业计划书范文
2014/02/05 职场文书
房屋转让协议书
2014/10/18 职场文书
2015年国庆放假通知范文
2015/08/18 职场文书
创业计划书之o2o水果店
2019/08/30 职场文书