django后台使用MySQL情况下的事务控制详解
写在前面:
默认情况下django会把autocommit设置为“1”也就是说所针对数据库的每一次操作都会被做成“单独”的一个事务;这样的处理好处就在于它方便,
在编程的时候可以少写一些代码,比如我们不用先“start transaction ” 操作完之后再“commit” 或 “rollback”。
django对事务控制的实现方式:
django中通过transaction.atomic()上下文来完成事务控制
- try:
- with transaction.atomic():
- # 对数据库的操作
- except Exception as e:
- # 异常处理
- #其它处理逻辑
以学院式的银行转账业务为例:
1):一张表示银行存款的表(为了突出事务控制在些不对表进行过多的设计)
- from django.db import models
- # Create your models here.
- class SavingCard(models.Model):
- name=models.CharField(max_length=64,default='',null=False)
- saving = models.DecimalField(max_digits=16,decimal_places=4,default=0,null=False)
以上模型它所对应的SQL语句如下
- CREATE TABLE `bank_savingcard` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `name` varchar(64) NOT NULL,
- `saving` decimal(16,4) NOT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8
手工在数据库中插入两行测试数据
- insert into bank_savingcard(name,saving) values
- ('jianglexing',100),('welson',80);
2):用django实现一个转账功能的view
- from django.shortcuts import render
- from .models import SavingCard
- from django.db import transaction
- from django.http import HttpResponse
- # Create your views here.
- def transfer(request,fromname,toname,count):
- """
- 完整的转账功能
- """
- try:
- with transaction.atomic():
- if count < 0:
- raise ValueError("转账资金不得小于0元")
- fromAccount = SavingCard.objects.get(name=fromname)
- toAccount = SavingCard.objects.get(name=toname)
- if count > fromAccount.saving:
- raise ValueError("转账资金不得大于卡内余额")
- fromAccount.saving=fromAccount.saving-count
- toAccount.saving = toAccount.saving + count
- fromAccount.save()
- toAccount.save()
- except Exception as e:
- return HttpResponse("<p>{} {}</p>".format("出现异常转账失败",e))
- return HttpResponse("转账成功")
注册转账接口
- from django.contrib import admin
- from django.urls import path
- from bank.views import transfer
- urlpatterns = [
- path('admin/', admin.site.urls),
- path('bank/<str:fromname>/transaction/<str:toname>/<int:count>/',transfer)
- ]
3):调用转账接口
- http://127.0.0.1:8080/bank/jianglexing/transaction/welson/5/
jianglexing转5元给welson
4):转账前后数据库的内容变化
- select * from bank_savingcard;
- +----+-------------+----------+
- | id | name | saving |
- +----+-------------+----------+
- | 1 | jianglexing | 100.0000 |
- | 2 | welson | 80.0000 |
- +----+-------------+----------+
- 2 rows in set (0.00 sec)
- select * from bank_savingcard;
- +----+-------------+---------+
- | id | name | saving |
- +----+-------------+---------+
- | 1 | jianglexing | 95.0000 |
- | 2 | welson | 85.0000 |
- +----+-------------+---------+
- 2 rows in set (0.00 sec)
5):强行转账1000元看一下
- http://127.0.0.1:8080/bank/jianglexing/transaction/welson/1000/
前后的数据库内容对比
- select * from bank_savingcard;
- +----+-------------+---------+
- | id | name | saving |
- +----+-------------+---------+
- | 1 | jianglexing | 95.0000 |
- | 2 | welson | 85.0000 |
- +----+-------------+---------+
- 2 rows in set (0.00 sec)
- select * from bank_savingcard;
- +----+-------------+---------+
- | id | name | saving |
- +----+-------------+---------+
- | 1 | jianglexing | 95.0000 |
- | 2 | welson | 85.0000 |
- +----+-------------+---------+
- 2 rows in set (0.00 sec)
6):强行转账1000到一个不存在的账号
----------------------------------------------------------------------------------------------
django后台使用MySQL情况下的事务控制详解的更多相关文章
- Mysql之锁、事务绝版详解---干货!
一 锁的分类及特性 数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则.对于任何一种数据库来说都需要有相应的锁定机制,所以MySQL自然也不能 ...
- Spring 使用注解对事务控制详解与实例
1.什么是事务 一荣俱荣,一损俱损,很多复杂的操作我们可以把它看成是一个整体,要么同时成功,要么同时失败. 事务的四个特征ACID: 原子性(Atomic):表示组成一个事务的多个数据库的操作的不可分 ...
- Net Core中数据库事务隔离详解——以Dapper和Mysql为例
Net Core中数据库事务隔离详解--以Dapper和Mysql为例 事务隔离级别 准备工作 Read uncommitted 读未提交 Read committed 读取提交内容 Repeatab ...
- Oracle 无备份情况下的恢复--控制文件/数据文件
13.3无备份恢复控制文件 没有备份恢复控制文件其实就是在nomount状态,create control创建一个新的控制文件. dba必须知道4个信息才能正确的创建:数据库名.在线日志路径及其大小. ...
- (转)MySQL性能调优my.cnf详解
MySQL性能调优my.cnf详解 https://blog.linuxeye.cn/379.html http://blog.csdn.net/orichisonic/article/details ...
- (转)Spring事务管理详解
背景:之前一直在学习数据库中的相关事务,而忽略了spring中的事务配置,在阿里面试时候基本是惨败,这里做一个总结. 可能是最漂亮的Spring事务管理详解 https://github.com/Sn ...
- 【Spring】——声明式事务配置详解
项目中用到了spring的事务: @Transactional(rollbackFor = Exception.class, transactionManager = "zebraTrans ...
- MySQL数据库的各种存储引擎详解
原文来自:MySQL数据库的各种存储引擎详解 MySQL有多种存储引擎,每种存储引擎有各自的优缺点,大家可以择优选择使用: MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB ...
- 可能是最漂亮的Spring事务管理详解
Java面试通关手册(Java学习指南):https://github.com/Snailclimb/Java_Guide 微信阅读地址链接:可能是最漂亮的Spring事务管理详解 事务概念回顾 什么 ...
随机推荐
- jquery keycode
判断键盘按下的键 $(window).keydown(function(event) { switch (event.which) { case (13): //Enter //要执行的操作 brea ...
- Endorsement 业务逻辑介绍
本文主要介绍保单系统中Endorsement功能的基本逻辑和过程,主要参考OIC系统 保单系统 保险公司用来管理保单的信息系统,这里简称为保单系统.主要作用是收集和维护投保人信息和投保信息,计算保费, ...
- JS密码校验规则前台验证(不能连续字符(如123、abc)连续3位或3位以上)(不能相同字符(如111、aaa)连续3位或3位以上)
密码必须为8到16位且必须包含数字和字母 密码必须包含特殊字符[_&#%] 不能连续字符(如123.abc)连续3位或3位以上 不能相同字符(如111.aaa)连续3位或3位以上 /** * ...
- CentOS静默安装Oracle 11gR2(x64)
环境 OS: CentOS 7.4; hosts: L134; IP: 192.168.1.134 DB: linux.x64_11gR2_database 安装依赖包 yum install -y ...
- flink 入门
http://ifeve.com/flink-quick-start/ http://vinoyang.com/2016/05/02/flink-concepts/ http://wuchong.me ...
- Knockout学习之组合监控属性
组合监控属性 顾名思义,就是我们可以将多个属性合并为一个属性.这样在显示的时候就是整体了,并且其中任何一个属性发生改变,这个属性也都会随之发生改变从而更新视图,而这些只需要使用computed函数就可 ...
- 目前主流的MQ
RabbitMQ.ActiveMQ.Jafka/Kafka.ZeroMQ.Redis等 这些mq框架的优缺点以及适用场景可自行百度. 后面我将对部分MQ框架进行比较深的学习
- 给Java程序员的几条建议
对于Java程序猿学习的建议 这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是LZ你是如何学习Java的,能不能给点建议? 今天LZ是打算来点干货,因此咱们就不说一些学 ...
- linux 常见音乐、视频播放器简介
2007-1-15 10:00:22 常见音乐播放器 xmms一族 xmms全称是X Multimedia System,这个经典的播放器可能是每个linux的使用者或多或少都 ...
- iOS实现基于VLC播放器的封装效果
前言: 在一些特定场景下,我们获取到的音视频,由于格式比较特殊,用avplayer等播放器是无法播放的,此时,我们可以借助强大的VLC播放器来处理. 原理这里不再赘述,下面我们讲一下如何添加VLC播放 ...