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环境下搭建属于自己的pip源的教程
May 05 Python
python3实现读取chrome浏览器cookie
Jun 19 Python
python实现应用程序在右键菜单中添加打开方式功能
Jan 09 Python
python中子类调用父类函数的方法示例
Aug 18 Python
Django 浅谈根据配置生成SQL语句的问题
May 29 Python
Python中存取文件的4种不同操作
Jul 02 Python
使用Python中的reduce()函数求积的实例
Jun 28 Python
Python IDE Pycharm中的快捷键列表用法
Aug 08 Python
python读文件的步骤
Oct 08 Python
Python的PIL库中getpixel方法的使用
Apr 09 Python
2021年值得向Python开发者推荐的VS Code扩展插件
Jan 25 Python
Python中的 Set 与 dict
Mar 13 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
颠覆常识!无色透明的咖啡诞生了(中日双语)
2021/03/03 咖啡文化
PHP系统命令函数使用分析
2013/07/05 PHP
laravel5.6中的外键约束示例
2019/10/23 PHP
基于Jquery的文字自动截取(提供源代码)
2011/08/09 Javascript
js 浏览器事件介绍
2012/03/30 Javascript
jQuery实现鼠标经过弹出提示信息的地图热点效果
2015/08/07 Javascript
跟我学习javascript的call(),apply(),bind()与回调
2015/11/16 Javascript
在Docker快速部署Node.js应用的详细步骤
2016/09/02 Javascript
bmob js-sdk 在vue中的使用教程
2018/01/21 Javascript
D3.js实现简洁实用的动态仪表盘的示例
2018/04/04 Javascript
对vue事件的延迟执行实例讲解
2018/08/28 Javascript
Javascript 实现 Excel 导入生成图表功能
2018/10/22 Javascript
JavaScript中工厂函数与构造函数示例详解
2019/05/06 Javascript
vue.js表单验证插件(vee-validate)的使用教程详解
2019/05/23 Javascript
用Python的Django框架完成视频处理任务的教程
2015/04/02 Python
Python压缩解压缩zip文件及破解zip文件密码的方法
2015/11/04 Python
Python中shutil模块的常用文件操作函数用法示例
2016/07/05 Python
Python2与python3中 for 循环语句基础与实例分析
2017/11/20 Python
python获取服务器响应cookie的实例
2018/12/28 Python
简单介绍python封装的基本知识
2019/08/10 Python
基于Python实现大文件分割和命名脚本过程解析
2019/09/29 Python
python将数组n等分的实例
2019/12/02 Python
详解python如何引用包package
2020/06/07 Python
Python实现爬取并分析电商评论
2020/06/19 Python
python中有帮助函数吗
2020/06/19 Python
使用Python判断一个文件是否被占用的方法教程
2020/12/16 Python
python 如何在测试中使用 Mock
2021/03/01 Python
解决CSS3的opacity属性带来的层叠顺序问题
2016/05/09 HTML / CSS
html5 canvas实现跟随鼠标旋转的箭头
2016/03/11 HTML / CSS
医学院毕业生自荐信
2013/11/08 职场文书
品德评语大全
2014/05/05 职场文书
2014普法依法治理工作总结
2014/12/18 职场文书
退休欢送会主持词
2015/07/01 职场文书
担保公司2015年终工作总结
2015/10/14 职场文书
MySQL表锁、行锁、排它锁及共享锁的使用详解
2022/04/02 MySQL
解决Oracle数据库用户密码过期
2022/05/11 Oracle