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进程通信之匿名管道实例讲解
Apr 11 Python
Python的Bottle框架中获取制定cookie的教程
Apr 24 Python
在Django的通用视图中处理Context的方法
Jul 21 Python
Python3中使用urllib的方法详解(header,代理,超时,认证,异常处理)
Sep 21 Python
Python算术运算符实例详解
May 31 Python
Python实现将照片变成卡通图片的方法【基于opencv】
Jan 17 Python
Anaconda2下实现Python2.7和Python3.5的共存方法
Jun 11 Python
Python+appium框架原生代码实现App自动化测试详解
Mar 06 Python
python模拟实现分发扑克牌
Apr 22 Python
Pycharm Available Package无法显示/安装包的问题Error Loading Package List解决
Sep 18 Python
Python 实现进度条的六种方式
Jan 06 Python
Python requests用法和django后台处理详解
Mar 19 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
全国FM电台频率大全 - 10 江苏省
2020/03/11 无线电
php session安全问题分析
2011/06/24 PHP
php遍历目录与文件夹的多种方法详解
2013/11/14 PHP
php实现通用的信用卡验证类
2015/03/24 PHP
PHP中include()与require()的区别说明
2017/02/14 PHP
拖动Html元素集合 Drag and Drop any item
2006/12/22 Javascript
jQuery判断元素是否是隐藏的代码
2011/04/24 Javascript
jQuery图片预加载 等比缩放实现代码
2011/10/04 Javascript
js实现全国省份城市级联下拉菜单效果代码
2015/09/07 Javascript
javascript跨域总结之window.name实现的跨域数据传输
2015/11/01 Javascript
jquery简单倒计时实现方法
2015/12/18 Javascript
javascript拖拽应用实例
2016/03/25 Javascript
两行代码轻松搞定JavaScript日期验证
2016/08/03 Javascript
Angular2 环境配置详细介绍
2016/09/21 Javascript
bootstrap fileinput完整实例分享
2016/11/08 Javascript
在js代码拼接dom对象到页面上去的模板总结(必看)
2017/02/14 Javascript
深入理解Vue transition源码分析
2017/07/30 Javascript
vue 虚拟dom的patch源码分析
2018/03/01 Javascript
微信小程序实现点击图片旋转180度并且弹出下拉列表
2018/11/27 Javascript
利用angular自动编译andriod APK的绕坑经历分享
2019/03/08 Javascript
JS+canvas五子棋人机对战实现步骤详解
2020/06/04 Javascript
[46:42]DOTA2-DPC中国联赛正赛 Aster vs Magma BO3 第二场 3月5日
2021/03/11 DOTA
python爬取网站数据保存使用的方法
2013/11/20 Python
python实现字符串连接的三种方法及其效率、适用场景详解
2017/01/13 Python
python 读取txt,json和hdf5文件的实例
2018/06/05 Python
python实现旋转和水平翻转的方法
2018/10/25 Python
Python实现查找二叉搜索树第k大的节点功能示例
2019/01/24 Python
python 函数中的参数类型
2020/02/11 Python
基于Python绘制个人足迹地图
2020/06/01 Python
使用canvas实现黑客帝国数字雨效果
2020/01/02 HTML / CSS
写好求职应聘自荐信的三部曲
2013/09/21 职场文书
毕业生幼师求职自荐信
2013/10/01 职场文书
护士长竞聘演讲稿
2014/04/30 职场文书
2015上半年个人工作总结
2015/07/27 职场文书
教师病假条范文
2015/08/17 职场文书
如何Python使用re模块实现okenizer
2022/04/30 Python