在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实现数据库事务操作的更多相关文章

  1. django基础之day05,orm字段参数,自定义需要的字段,orm中的事务操作

    orm字段和参数 charfield varchar integerfield int bigintegerfield bigint emailfield varchar(254) datefield ...

  2. Django中ORM对数据库的增删改查

    Django中ORM对数据库数据的增删改查 模板语言 {% for line in press %} {% line.name %} {% endfor %} {% if 条件 %}{% else % ...

  3. django 中连接mysql数据库的操作步骤

    django中连接mysql数据库的操作步骤: 1 settings配置文件中 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mys ...

  4. Spring事务传播及数据库事务操作

    从Spring 事务配置说起 先看看Spring 事务的基础配置 <aop:aspectj-autoproxy proxy-target-class="true"/> ...

  5. TP5数据库事务操作

    使用事务处理的话,需要数据库引擎支持事务处理.比如 MySQL 的 MyISAM 不支持事务处理,需要使用 InnoDB 引擎. 使用 transaction 方法操作数据库事务,当发生异常会自动回滚 ...

  6. Django之ORM对数据库操作

    基本操作 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <3> get(**kwargs): ...

  7. Django框架之ORM(数据库)操作

    一.ORM介绍 映射关系: 表名 -------------------->类名 字段-------------------->属性 表记录----------------->类实例 ...

  8. Django中ORM对数据库的增删改查操作

         前言 什么是ORM?  ORM(对象关系映射)指用面向对象的方法处理数据库中的创建表以及数据的增删改查等操作. 简而言之,就是将数据库的一张表当作一个类,数据库中的每一条记录当作一个对象.在 ...

  9. django notes 六:数据库 CRUD 操作

    CRUD 也没什么可说的,django 提供了完善的 orm  api, 直接用就行了. 我只贴几个列子,一看就明白了,自己再用用就熟了. # create b = Blog(name='Beatle ...

随机推荐

  1. AdaBoostRegressor

    class sklearn.ensemble.AdaBoostRegressor(base_estimator=None, n_estimators=50, learning_rate=1.0, lo ...

  2. Linux批量处理文件脚本

    Linux shell字符串截取与拼接 一 Linux 的字符串截取很有用.有八种方法. 假设有变量 var=http://www.linuxidc.com/123.htm 1  # 号截取,删除左边 ...

  3. 我使用 Docker 部署 Celery 遇到的问题

    问题1 - Sending due task 本机测试时没有问题的,但是在线上 docker 中,任务一直显示 "Sending due task".超时的任务是 Django O ...

  4. Uva 10339 - Watching Watches【数论,暴力】

    题目链接:10339 - Watching Watches 题意:两个时钟,一个每天慢a秒,一个每天慢b秒,问两钟重新相遇的时刻 1圈有12 * 60 * 60秒,然后1圈 / abs(a - b), ...

  5. HDU1097-A hard puzzle-快速幂+取模

    快速幂: 代码: kuaisumi(ll a,ll b){      ll ans=;      while(b){          ==){              ans=ans*a;     ...

  6. c#中winform窗口的隐藏与显示

    最近在做一个C# 的winform客户端程序,要实现在打开新的窗口时将原来打开的窗口关闭,但是想在关闭新打开的窗口是将原来的那个窗口再次打开,在网上查找各种资料,找了很多代码,都是通过窗口.Hide( ...

  7. 使用 SVG 和 JS 创建一个由星形变心形的动画

    序言:首先,这是一篇学习 SVG 及 JS 动画不可多得的优秀文章.我非常喜欢 Ana Tudor 写的教程.在她的教程中有大量使用 SVG 制作的图解以及实时交互 DEMO,可以说教程的所有细枝末节 ...

  8. UE4 custom depth 自定义深度

    用途1: 半透明材质中实现遮挡Mesh自己其他部分的效果. 不遮挡效果如下: 遮挡后效果如下: 实现方法: 深度信息是越远值越大,使用两个Mesh,一个正常渲染,另一个渲染到custom depth ...

  9. JavaScript八张思维导图—基本概念

    JS基本概念 JS操作符 JS基本语句 JS数组用法 Date用法 JS字符串用法 JS编程风格 JS编程实践 不知不觉做前端已经五年多了,无论是从最初的jQuery还是现在火热的Angular,Vu ...

  10. Spark_总结七_troubleshooting

    转载标明出处 http://www.cnblogs.com/haozhengfei/p/07ef4bda071b1519f404f26503fcba44.html Spark_总结七_troubles ...