文档章节

django数据库事务使用记录

子夜闻雪
 子夜闻雪
发布于 2016/04/11 18:43
字数 754
阅读 76
收藏 2
点赞 2
评论 0

django版本:1.8+, 数据库: mysql

    事务:事务是一系列数据库语句的原子集。即使程序在运行时崩溃了,数据库可以确保事物集中的所有变更要么都被提交,要么都被放弃。

    我们知道mysql数据库支持多种存储引擎。如MYISAM和innodb。在mysql5.5.5之后,innodb为mysql的默认存储引擎。innodb特点就是支持事务操作和外键约束。这里记录下django对数据库事务的api使用,假设我们使用的是innodb。如果数据库不支持事务操作的话, 那么Django会一直工作在自动提交模式 : 语句一旦被调用就会被执行和提交。

1.     可以在settings.py文件中的数据库配置加上配置项ATOMIC_REQUESTS:True。 这样的话,django在调用一个view里面的方法之前,django开始一个事务如果view执行的响应没有问题, Django就会提交这个事务。如果在view这里产生一个异常,Django就会回滚这次事务。

    配置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db_name',                      # Or path to database file if using sqlite3.
        # The following settings are not used with sqlite3:
        'USER': 'user',
        'PASSWORD': 'password',
        'HOST': '',                      # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
        'PORT': '',                      # Set to empty string for default.
        # 'ATOMIC_REQUESTS': True ,         # 当需要将每个HTTP 请求封装在一个数据库事务中时,设置它为True
        # 'AUTOCOMMIT': False,             # 如果你需要禁用Django 的事务管理并自己实现,设置它为False。默认为True,
        # 'CONN_MAX_AGE': 0,              # 数据库连接的存活时间,以秒为单位。0 表示在每个请求结束时关闭数据库连接 —— 这是Django 的历史遗留行为, None 表示无限的持久连接。
    },
    'OPTIONS': {
      'init_command': 'SET storage_engine=INNODB',
      'charset': 'utf8mb4'
   }
}

    如果某个视图不想有事务管理,可以通过@non_atomic_requests()修饰view函数,这样的话,这个view函数执行逻辑就是autocommit。

@non_atomic_requests()
def helloworld(request):
   if 'method' in request.GET:
      if request.GET['method'] == 'new':
         Book.objects.create(title=request.GET['title'])
         if request.GET['title'] == 'error':
            raise Exception("error")
   return HttpResponse("helloworld")

    这样的话,这个views将autocommit,Book.objects.create(title=request.GET['title'])执行时将直接commit到数据库。


2.      不通过上面的方式配置ATOMIC_REQUESTS。django的django.db.transaction提供了多个方式管理事务。主要的是atomic。我们可以使用@atomic修饰相应的视图函数,或者可以使用上下文管理器只在一段代码段进行事务管理。

@atomic()
def helloworld(request):
   if 'method' in request.GET:
      if request.GET['method'] == 'new':
         Book.objects.create(title=request.GET['title'])
         if request.GET['title'] == 'error':
            raise Exception("error")
   return HttpResponse("helloworld")

    请求helloworld?method=new&title=error的话。Book.objects.create(title=request.GET['title'])将不会提交到数据库。

    atomic()可以多层嵌套。最外面一层atomic()执行时,django将在数据库连接上设置in_atomic_block为True,使用set_autocommit(False)开始一个事务。非最外层的atomic()执行时,因为in_atomic_block已经为True,就会savepoint()创建保存点。 推出时,也是一层层commit或者rollback。


© 著作权归作者所有

共有 人打赏支持
子夜闻雪
粉丝 2
博文 37
码字总数 16415
作品 0
海淀
程序员
Django 事务小结

官方关于事务的说明 Django 默认的事务行为(Django’s default transaction behavior) Django 默认情况下是运行一个打开的事务,这个事务在 model 中引起了数据变动的内置函式被调用时,就会...

楠木楠
2016/09/28
443
0
dajngo 数据库事物的处理

[Django学习]事务处理 其实事务处理已经在 django 中提供了,但是很奇怪好象没有过多的“笔墨”来说明这个事。今天看了看,真是非常简单。具体的在 django 所带的 transaction 文档中。 djan...

山下狮子
2014/01/23
145
0
python django事务transaction源码分析

python Django事务 网上关于django1.6的事务资料很多,但是1.8的却搜不到任何资料,自己要用的时候费了不少劲就是不行,现在记下要用的人少走弯路version:Django 1.8事务官方文档事务中文文...

张豪飞
2016/07/26
103
0
如何在 Django 中使用 django-south,实现数据迁移

在本文中, 将会介绍Django-south的基本概念和基本用法, 帮助Django开发人员简化数据迁移的过程. 在django-admin命令中有syncdb指令, 其目的是根据model.py创建相应的数据库表. 但我们在开发的...

fromdtor
2014/04/27
0
0
[Python] 探讨Django的MTV模式(二)

在上一篇关于Django MTV模式的文章中,简单介绍了MTV模式的结构即概念,这篇就以一个直观的小例子说明MTV的设计理念。 Django主要有4个python文件组成(models.py , views.py , urls.py ) 和h...

长平狐
2013/06/03
179
0
[Python] 探讨Django的MTV模式(二)

在上一篇关于Django MTV模式的文章中,简单介绍了MTV模式的结构即概念,这篇就以一个直观的小例子说明MTV的设计理念。 Django主要有4个python文件组成(models.py , views.py , urls.py ) 和h...

长平狐
2013/06/03
109
0
第五章 模型

第五章 模型 在第三章,我们讲述了用 Django 建造网站的基本途径: 建立视图和 URLConf 。 正如我们所阐述的,视图负责处理一些主观逻辑,然后返回响应结果。 作为例子之一,我们的主观逻辑是...

阿帆提
2016/11/10
0
0
Django查询集 API

查询集API 参考 本文档描述查询集 API 的细节。它建立在模型和数据库查询指南的基础上,所以在阅读本文档之前,你也许需要首先阅读这两部分的文档。 本文档将通篇使用在数据库查询指南中用到...

楠木楠
2016/09/25
1K
0
知识详解4:django之models与数据表

1.前言 上文中我们在views中的传递了一个字典,然后在templates中显示了出来,在实际的操作中不可能都这么传递数据,这里就需要用到数据库。第一节时我们创建django项目时,默认生成了一个s...

fuckCoding
2017/11/06
0
0
MongoDB距“干掉”MySQL登上王位还有多远

  【IT168 资讯】几十年来,关系型数据库已经成为企业应用程序的基础,自从MySQL在1995年发布以来,深受企业的偏爱。然而随着近年来数据量和数据的不断激增,非关系数据库技术如MongoDB应运...

it168网站
2017/12/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Android 获取各大音乐平台的真实下载地址

废话 电脑使用谷歌浏览器或者QQ浏览器的时候。。。。。。。说不清楚,还是看图吧 大概意思就是,只要网页上需要播放,只要能播放并且开始播放,这个过程就肯定会请求到相关的音乐资源,然后就...

她叫我小渝
34分钟前
0
0
shell中的函数、shell中的数组、告警系统需求分析

shell中的函数 格式: 格式: function f_name() { command } 函数必须要放在最前面 示例1(用来打印参数) 示例2(用于定义加法) 示例3(用于显示IP) shell中的数组 shell中的数组1 定义数...

Zhouliang6
今天
2
0
用 Scikit-Learn 和 Pandas 学习线性回归

      对于想深入了解线性回归的童鞋,这里给出一个完整的例子,详细学完这个例子,对用scikit-learn来运行线性回归,评估模型不会有什么问题了。 1. 获取数据,定义问题     没有...

wangxuwei
今天
1
0
MAC安装MAVEN

一:下载maven压缩包(Zip或tar可选),解压压缩包 二:打开终端输入:vim ~/.bash_profile(如果找不到该文件新建一个:touch ./bash_profile) 三:输入i 四:输入maven环境变量配置 MAVEN_HO...

WALK_MAN
今天
0
0
33.iptables备份与恢复 firewalld的9个zone以及操作 service的操作

10.19 iptables规则备份和恢复 10.20 firewalld的9个zone 10.21 firewalld关于zone的操作 10.22 firewalld关于service的操作 10.19 iptables规则备份和恢复: ~1. 保存和备份iptables规则 ~2...

王鑫linux
今天
2
0
大数据教程(2.11):keeperalived+nginx高可用集群搭建教程

上一章节博主为大家介绍了目前大型互联网项目的系统架构体系,相信大家应该注意到其中很重要的一块知识nginx技术,在本节博主将为大家分享nginx的相关技术以及配置过程。 一、nginx相关概念 ...

em_aaron
今天
1
0
Apache Directory Studio连接Weblogic内置LDAP

OBIEE默认使用Weblogic内置LDAP管理用户及组。 要整理已存在的用户及组,此前办法是导出安全数据,文本编辑器打开认证文件,使用正则表达式获取用户及组的信息。 后来想到直接用Apache Dire...

wffger
今天
2
0
HFS

FS,它是一种上传文件的软件。 专为个人用户所设计的 HTTP 档案系统 - Http File Server,如果您觉得架设 FTP Server 太麻烦,那么这个软件可以提供您更方便的档案传输系统,下载后无须安装,...

garkey
今天
1
0
Java IO类库之BufferedInputStream

一、BufferedInputStream介绍 /** * A <code>BufferedInputStream</code> adds * functionality to another input stream-namely, * the ability to buffer the input and to * sup......

老韭菜
今天
0
0
STM 32 窗口看门狗

http://bbs.elecfans.com/jishu_805708_1_1.html https://blog.csdn.net/a1985831055/article/details/77404131...

whoisliang
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部