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 拷贝对象(深拷贝deepcopy与浅拷贝copy)
Sep 06 Python
Python中atexit模块的基本使用示例
Jul 08 Python
python发送邮件功能实现代码
Jul 15 Python
Python 提取dict转换为xml/json/table并输出的实现代码
Aug 28 Python
Python实现购物车功能的方法分析
Nov 10 Python
python dataframe向下向上填充,fillna和ffill的方法
Nov 28 Python
python sorted方法和列表使用解析
Nov 18 Python
Python调用graphviz绘制结构化图形网络示例
Nov 22 Python
pycharm通过ssh连接远程服务器教程
Feb 12 Python
浅谈python 中的 type(), dtype(), astype()的区别
Apr 09 Python
Python操作MySQL数据库的示例代码
Jul 13 Python
vscode+PyQt5安装详解步骤
Aug 12 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
相对路径转化成绝对路径
2007/04/10 PHP
首页四格,首页五格For6.0(GBK)(UTF-8)[12种组合][9-18][版主安装测试通过]
2007/09/24 PHP
Yii框架获取当前controlle和action对应id的方法
2014/12/03 PHP
PHP实现加密文本文件并限制特定页面的存取的效果
2016/10/21 PHP
一些常用的Javascript函数
2006/12/22 Javascript
js控制CSS样式属性语法对照表
2012/12/11 Javascript
jquery实现简单的拖拽效果实例兼容所有主流浏览器
2013/06/21 Javascript
js中数组(Array)的排序(sort)注意事项说明
2014/01/24 Javascript
JS对img标签进行优化使用onerror显示默认图像
2014/04/24 Javascript
jquery调整表格行tr上下顺序实例讲解
2016/01/09 Javascript
AngularJS路由实现页面跳转实例
2017/03/03 Javascript
Vue.js实战之使用Vuex + axios发送请求详解
2017/04/04 Javascript
深入理解 JavaScript 中的 JSON
2017/04/06 Javascript
ionic选择多张图片上传的示例代码
2017/10/10 Javascript
JavaScript 中判断变量是否为数字的示例代码
2020/10/22 Javascript
JavaScript 声明私有变量的两种方式
2021/02/05 Javascript
Python操作MongoDB详解及实例
2017/05/18 Python
python的Tqdm模块的使用
2018/01/10 Python
python之文件读取一行一行的方法
2018/07/12 Python
Python3中内置类型bytes和str用法及byte和string之间各种编码转换 问题
2018/09/27 Python
详解PyCharm安装MicroPython插件的教程
2019/06/24 Python
Python设置matplotlib.plot的坐标轴刻度间隔以及刻度范围
2019/06/25 Python
python3射线法判断点是否在多边形内
2019/06/28 Python
pytorch sampler对数据进行采样的实现
2019/12/31 Python
k-means 聚类算法与Python实现代码
2020/06/01 Python
Python Django搭建网站流程图解
2020/06/13 Python
美赞臣新加坡官方旗舰店:Enfagrow新加坡
2019/05/15 全球购物
日本订房网站,预订日本星级酒店/温泉旅馆:Relux(支持中文)
2020/01/03 全球购物
前厅收银主管岗位职责
2014/02/04 职场文书
如何写好建议书
2014/03/13 职场文书
汽车广告策划方案
2014/05/31 职场文书
我的未来不是梦演讲稿
2014/09/02 职场文书
世界气象日活动总结
2015/02/27 职场文书
2016年大学校运会广播稿件
2015/12/21 职场文书
《自己去吧》教学反思
2016/02/16 职场文书
导游词之无锡东林书院
2019/12/11 职场文书