写在前面:

  默认情况下django会把autocommit设置为“1”也就是说所针对数据库的每一次操作都会被做成“单独”的一个事务;这样的处理好处就在于它方便,

  在编程的时候可以少写一些代码,比如我们不用先“start transaction ” 操作完之后再“commit” 或 “rollback”。

django对事务控制的实现方式:

  django中通过transaction.atomic()上下文来完成事务控制

  1. try:
  2. with transaction.atomic():
  3. # 对数据库的操作
  4. except Exception as e:
  5. # 异常处理
  6.  
  7. #其它处理逻辑

以学院式的银行转账业务为例:

  1):一张表示银行存款的表(为了突出事务控制在些不对表进行过多的设计)

  1. from django.db import models
  2.  
  3. # Create your models here.
  4.  
  5. class SavingCard(models.Model):
  6. name=models.CharField(max_length=64,default='',null=False)
  7. saving = models.DecimalField(max_digits=16,decimal_places=4,default=0,null=False)

  以上模型它所对应的SQL语句如下

  1. CREATE TABLE `bank_savingcard` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `name` varchar(64) NOT NULL,
  4. `saving` decimal(16,4) NOT NULL,
  5. PRIMARY KEY (`id`)
  6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8

  手工在数据库中插入两行测试数据

  1. insert into bank_savingcard(name,saving) values
  2. ('jianglexing',100),('welson',80);

  2):用django实现一个转账功能的view

  1. from django.shortcuts import render
  2. from .models import SavingCard
  3. from django.db import transaction
  4. from django.http import HttpResponse
  5. # Create your views here.
  6.  
  7. def transfer(request,fromname,toname,count):
  8. """
  9. 完整的转账功能
  10. """
  11.  
  12. try:
  13. with transaction.atomic():
  14. if count < 0:
  15. raise ValueError("转账资金不得小于0元")
  16.  
  17. fromAccount = SavingCard.objects.get(name=fromname)
  18. toAccount = SavingCard.objects.get(name=toname)
  19. if count > fromAccount.saving:
  20. raise ValueError("转账资金不得大于卡内余额")
  21.  
  22. fromAccount.saving=fromAccount.saving-count
  23. toAccount.saving = toAccount.saving + count
  24.  
  25. fromAccount.save()
  26. toAccount.save()
  27. except Exception as e:
  28. return HttpResponse("<p>{} {}</p>".format("出现异常转账失败",e))
  29. return HttpResponse("转账成功")

  注册转账接口

  1. from django.contrib import admin
  2. from django.urls import path
  3. from bank.views import transfer
  4.  
  5. urlpatterns = [
  6. path('admin/', admin.site.urls),
  7. path('bank/<str:fromname>/transaction/<str:toname>/<int:count>/',transfer)
  8. ]

  3):调用转账接口

  1. http://127.0.0.1:8080/bank/jianglexing/transaction/welson/5/

  jianglexing转5元给welson

  4):转账前后数据库的内容变化

  1. select * from bank_savingcard;
  2. +----+-------------+----------+
  3. | id | name | saving |
  4. +----+-------------+----------+
  5. | 1 | jianglexing | 100.0000 |
  6. | 2 | welson | 80.0000 |
  7. +----+-------------+----------+
  8. 2 rows in set (0.00 sec)
  9.  
  10. select * from bank_savingcard;
  11. +----+-------------+---------+
  12. | id | name | saving |
  13. +----+-------------+---------+
  14. | 1 | jianglexing | 95.0000 |
  15. | 2 | welson | 85.0000 |
  16. +----+-------------+---------+
  17. 2 rows in set (0.00 sec)

  5):强行转账1000元看一下

  1. http://127.0.0.1:8080/bank/jianglexing/transaction/welson/1000/

  前后的数据库内容对比

  1. select * from bank_savingcard;
  2. +----+-------------+---------+
  3. | id | name | saving |
  4. +----+-------------+---------+
  5. | 1 | jianglexing | 95.0000 |
  6. | 2 | welson | 85.0000 |
  7. +----+-------------+---------+
  8. 2 rows in set (0.00 sec)
  9.  
  10. select * from bank_savingcard;
  11. +----+-------------+---------+
  12. | id | name | saving |
  13. +----+-------------+---------+
  14. | 1 | jianglexing | 95.0000 |
  15. | 2 | welson | 85.0000 |
  16. +----+-------------+---------+
  17. 2 rows in set (0.00 sec)

  6):强行转账1000到一个不存在的账号

----------------------------------------------------------------------------------------------

django后台使用MySQL情况下的事务控制详解的更多相关文章

  1. Mysql之锁、事务绝版详解---干货!

    一 锁的分类及特性 数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则.对于任何一种数据库来说都需要有相应的锁定机制,所以MySQL自然也不能 ...

  2. Spring 使用注解对事务控制详解与实例

    1.什么是事务 一荣俱荣,一损俱损,很多复杂的操作我们可以把它看成是一个整体,要么同时成功,要么同时失败. 事务的四个特征ACID: 原子性(Atomic):表示组成一个事务的多个数据库的操作的不可分 ...

  3. Net Core中数据库事务隔离详解——以Dapper和Mysql为例

    Net Core中数据库事务隔离详解--以Dapper和Mysql为例 事务隔离级别 准备工作 Read uncommitted 读未提交 Read committed 读取提交内容 Repeatab ...

  4. Oracle 无备份情况下的恢复--控制文件/数据文件

    13.3无备份恢复控制文件 没有备份恢复控制文件其实就是在nomount状态,create control创建一个新的控制文件. dba必须知道4个信息才能正确的创建:数据库名.在线日志路径及其大小. ...

  5. (转)MySQL性能调优my.cnf详解

    MySQL性能调优my.cnf详解 https://blog.linuxeye.cn/379.html http://blog.csdn.net/orichisonic/article/details ...

  6. (转)Spring事务管理详解

    背景:之前一直在学习数据库中的相关事务,而忽略了spring中的事务配置,在阿里面试时候基本是惨败,这里做一个总结. 可能是最漂亮的Spring事务管理详解 https://github.com/Sn ...

  7. 【Spring】——声明式事务配置详解

    项目中用到了spring的事务: @Transactional(rollbackFor = Exception.class, transactionManager = "zebraTrans ...

  8. MySQL数据库的各种存储引擎详解

    原文来自:MySQL数据库的各种存储引擎详解   MySQL有多种存储引擎,每种存储引擎有各自的优缺点,大家可以择优选择使用: MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB ...

  9. 可能是最漂亮的Spring事务管理详解

    Java面试通关手册(Java学习指南):https://github.com/Snailclimb/Java_Guide 微信阅读地址链接:可能是最漂亮的Spring事务管理详解 事务概念回顾 什么 ...

随机推荐

  1. jquery keycode

    判断键盘按下的键 $(window).keydown(function(event) { switch (event.which) { case (13): //Enter //要执行的操作 brea ...

  2. Endorsement 业务逻辑介绍

    本文主要介绍保单系统中Endorsement功能的基本逻辑和过程,主要参考OIC系统 保单系统 保险公司用来管理保单的信息系统,这里简称为保单系统.主要作用是收集和维护投保人信息和投保信息,计算保费, ...

  3. JS密码校验规则前台验证(不能连续字符(如123、abc)连续3位或3位以上)(不能相同字符(如111、aaa)连续3位或3位以上)

    密码必须为8到16位且必须包含数字和字母 密码必须包含特殊字符[_&#%] 不能连续字符(如123.abc)连续3位或3位以上 不能相同字符(如111.aaa)连续3位或3位以上 /** * ...

  4. CentOS静默安装Oracle 11gR2(x64)

    环境 OS: CentOS 7.4; hosts: L134; IP: 192.168.1.134 DB: linux.x64_11gR2_database 安装依赖包 yum install -y ...

  5. flink 入门

    http://ifeve.com/flink-quick-start/ http://vinoyang.com/2016/05/02/flink-concepts/ http://wuchong.me ...

  6. Knockout学习之组合监控属性

    组合监控属性 顾名思义,就是我们可以将多个属性合并为一个属性.这样在显示的时候就是整体了,并且其中任何一个属性发生改变,这个属性也都会随之发生改变从而更新视图,而这些只需要使用computed函数就可 ...

  7. 目前主流的MQ

    RabbitMQ.ActiveMQ.Jafka/Kafka.ZeroMQ.Redis等 这些mq框架的优缺点以及适用场景可自行百度. 后面我将对部分MQ框架进行比较深的学习

  8. 给Java程序员的几条建议

    对于Java程序猿学习的建议 这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是LZ你是如何学习Java的,能不能给点建议? 今天LZ是打算来点干货,因此咱们就不说一些学 ...

  9. linux 常见音乐、视频播放器简介

    2007-1-15 10:00:22     常见音乐播放器     xmms一族     xmms全称是X Multimedia System,这个经典的播放器可能是每个linux的使用者或多或少都 ...

  10. iOS实现基于VLC播放器的封装效果

    前言: 在一些特定场景下,我们获取到的音视频,由于格式比较特殊,用avplayer等播放器是无法播放的,此时,我们可以借助强大的VLC播放器来处理. 原理这里不再赘述,下面我们讲一下如何添加VLC播放 ...