Django的ORM实现数据库事务操作
在Django中实现数据库的事务操作
在学习MySQL数据库时,MySQL数据库是支持原子操作的.
什么是数据库的原子操作呢??打个比方,一个消费者在一个商户里刷信用卡消费.
交易正常时,银行在消费者的账户里减去相应的款项,在商户的帐户加上相应的款项.
但是如果银行从消费者的账户里扣完钱之后,还未在商户的帐户里加上相应的款项时.
由于某些原因,系统或者数据库出现异常了,那么此时钱已经从消费者的账户里扣除了,但是商户的账户里却没有加上相应的款项,让会让商户遭受损失.
这种情况下,最好的解决办法就是使用数据库的原子性操作.
如果数据库使用了事务操作,当出现上面的操作异常时,待数据库正常运行后,数据库系统会把先前执行了一半的操作退回到这个操作之前的状态,
这个通常称为数据库的回滚,也即数据库的原子性操作.
Django中,正常的数据库操作应该是原子性操作的.
在Django的ORM中,想使用事务操作时,要先导入一个Django的内置模块
from django.db import transaction
首先创建一个项目test,项目中有一个应用app01.
项目的model为:
from django.db import models
class Userinfo(models.Model):
username=models.CharField("用户名",max_length=32)
email=models.EmailField("邮箱",max_length=32)
class Group(models.Model):
title=models.CharField("组名",max_length=32)
配置好url
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/',views.index),
]
路由对应的视图函数为
from django.shortcuts import render,HttpResponse
from . import models
def index(request):
from django.db import transaction
try:
with transaction.atomic():
models.Userinfo.objects.create(username="python001",email="python001@qq.com")
models.Group.objects.create(title="python002")
except Exception as e:
return HttpResponse("出现错误....")
return HttpResponse("ok")
首在先浏览器中打开http://127.0.0.1:8000/index/,浏览器的页面上出现

打开对应的数据库可以看到,UserInfo数据表和Group数据表中已经添加一条记录


现在修改视图函数,使程序出现运行错误,
from django.shortcuts import render,HttpResponse
from . import models
def index(request):
from django.db import transaction
try:
with transaction.atomic():
models.Userinfo.objects.create(username="python001",email="python001@qq.com")
models.Group.objects.create(title="python002")
except Exception as e:
return HttpResponse("出现错误....")
return HttpResponse("ok")
再次刷新浏览器,可以看到

而刷新两张数据表,可以看到两张数据库都没有添加数据记录.


这就是Django的ORM所支持的事务操作.!
Django的ORM实现数据库事务操作的更多相关文章
- django基础之day05,orm字段参数,自定义需要的字段,orm中的事务操作
orm字段和参数 charfield varchar integerfield int bigintegerfield bigint emailfield varchar(254) datefield ...
- Django中ORM对数据库的增删改查
Django中ORM对数据库数据的增删改查 模板语言 {% for line in press %} {% line.name %} {% endfor %} {% if 条件 %}{% else % ...
- django 中连接mysql数据库的操作步骤
django中连接mysql数据库的操作步骤: 1 settings配置文件中 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mys ...
- Spring事务传播及数据库事务操作
从Spring 事务配置说起 先看看Spring 事务的基础配置 <aop:aspectj-autoproxy proxy-target-class="true"/> ...
- TP5数据库事务操作
使用事务处理的话,需要数据库引擎支持事务处理.比如 MySQL 的 MyISAM 不支持事务处理,需要使用 InnoDB 引擎. 使用 transaction 方法操作数据库事务,当发生异常会自动回滚 ...
- Django之ORM对数据库操作
基本操作 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <3> get(**kwargs): ...
- Django框架之ORM(数据库)操作
一.ORM介绍 映射关系: 表名 -------------------->类名 字段-------------------->属性 表记录----------------->类实例 ...
- Django中ORM对数据库的增删改查操作
前言 什么是ORM? ORM(对象关系映射)指用面向对象的方法处理数据库中的创建表以及数据的增删改查等操作. 简而言之,就是将数据库的一张表当作一个类,数据库中的每一条记录当作一个对象.在 ...
- django notes 六:数据库 CRUD 操作
CRUD 也没什么可说的,django 提供了完善的 orm api, 直接用就行了. 我只贴几个列子,一看就明白了,自己再用用就熟了. # create b = Blog(name='Beatle ...
随机推荐
- 1c19b35b005744d55261682b361804fa 如何破解经过 MD5 算法处理的信息?
Md5密文破解(解密)可以说是网络攻击中的一个必不可少的环节,是工具中的一个重要"辅助工具".md5解密主要用于网络攻击,在对网站等进行入侵过程,有可能获得管理员或者其他用户的账号 ...
- NOI 2004 郁闷的出纳员
Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常 ...
- SPOJ GSS1_Can you answer these queries I(线段树区间合并)
SPOJ GSS1_Can you answer these queries I(线段树区间合并) 标签(空格分隔): 线段树区间合并 题目链接 GSS1 - Can you answer these ...
- jquery dataTimePicker日历插件(精确到小时)
效果图: 下载地址:https://github.com/WangChangyao/jquery-dataTimePicker.git <!DOCTYPE html> <h ...
- TCP层的分段和IP层的分片之间的关系 & MTU和MSS之间的关系 (转载)
首先说明:数据报的分段和分片确实发生,分段发生在传输层,分片发生在网络层.但是对于分段来说,这是经常发生在UDP传输层协议上的情况,对于传输层使用TCP协议的通道来说,这种事情很少发生. 1,MTU( ...
- JavaScript基础:DOM操作详解
本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. 前言 JavaScript的组成 JavaScript基础分为三个部分: ...
- ADO.NET复习总结(4)--访问SqlServer的类
1.连接SqlConnection 2. 3.执行命令SqlCommand 4.数据读取SqlDataReader 注意: ExecuteNonQuery() :执行非查询(增删改) Execute ...
- Code4 APP
MJExtension 斯坦福大学公开课
- TCP长连接和短连接的区别
当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次握手的,而释放则需 ...
- List源码学习之LinkedList
LinkedList 内部数据接口为一个链表,存储数据可为空可重复. 1.包含主要参数: //集合长度transient int size = 0; /** * 头结点 */ transient No ...