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事务管理详解 事务概念回顾 什么 ...
随机推荐
- JS 处理Json数据事例
JS从远端获取数据之后,往往还需要在处理一下,下面给出一个事例,供参考 将'[{"role_id":1,"enable":1},{"role_id&q ...
- Mysql查询数据库表结构以及字段类型并展示
1.建表语句sys_user CREATE TABLE `sys_user` ( `id` varchar(32) NOT NULL COMMENT '编号', `dept_id` varchar(3 ...
- Oracle Data Integrator 12c-模型(Model)和 数据存储(DataStore)
一.概念 Model模型: 描述关系型数据的模型. 是一组存放在特定的技术(如Oracle)的数据存储的集合.例如当技术为Oracle时,对应于数据库的Scheme DataStore: 数据存储 一 ...
- Generating phar.phar chmod: cannot access `ext/phar/phar.phar': No such file or directory make: [ext/phar/phar.phar] Error 1 (ignored)
make install出现了cp: cannot stat `ext/phar/phar.phar': No such file or directory 于是我又: cd ext/phar/ls ...
- Centos7.4下keepalived-1.3.5的安装使用
keepalived两个功能,一个是使lvs使用的vip高可用,一个是监控下游各个子节点的对应端口是否正常工作,以保证快速剔除坏掉的节点. keepalived默认的yum 1.3.5有BUG,根本跑 ...
- [POST] What Is the Linux fstab File, and How Does It Work?
If you’re running Linux, then it’s likely that you’ve needed to change some options for your file sy ...
- JavaScript概念梳理
一.JavaScript 的奇葩命名史 1995 年,网景浏览器(Netscape Navigator)首次发布了一种运行于浏览器端的脚本语言,网景给这个新语言命名为 LiveScript.一年后,为 ...
- 【DeepLearning】Exercise:Vectorization
Exercise:Vectorization 习题的链接:Exercise:Vectorization 注意点: MNIST图片的像素点已经经过归一化. 如果再使用Exercise:Sparse Au ...
- Zabbix检测Mysql数据库的主从同步
在高并发网站架构中,MySQL数据库主从同步是不可或缺的,不过经常会发生由于网络原因或者操作错误,MySQL主从经常会出现不同步的情况,那么如何监控MySQL主从同步,也变成检测网站正常运行的重要环节 ...
- 解析form表单数据
//解析form表单数据 function parseFormData(params) { var args = new Object(); for(var key in params){ if(!p ...