写在前面:

  默认情况下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情况下的事务控制详解的更多相关文章

  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. scala 基础语法

    文章内容全部来自:http://twitter.github.io/scala_school/zh_cn/index.html 表达式 scala> 1 + 1 res0: Int = 2 值 ...

  2. Android View的事件分发机制

    准备了一阵子,一直想写一篇事件分发的文章总结一下.这个知识点实在是太重要了. 一个应用的布局是丰富的,有TextView,ImageView,Button等.这些子View的外层还有ViewGroup ...

  3. JavaScript中如何检测一个变量是一个String类型?请写出函数实现

    方法1. function isString(obj){ return typeof(obj) === "string"? true: false; // returntypeof ...

  4. ReactNative踩坑日志——fetch如何向服务器传递参数

    一:简单参数 简单的参数,我们可以使用手动拼接的方式传递. 格式为: fetch(url?key1=val1&key2=val2&...).then((response) => ...

  5. ES6学习笔记一:let、const、解构赋值

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/7236342.html 感谢阮一峰老师的无私奉献,开源推动世界!教程地址:http://es6.ruanyife ...

  6. Selenium上传文件

    selenium自带了对应的API可以上传问题,如果这个上传文件的html code中显示的type是file那么你就可以使用下面的代码上传文件. /** * click the upload but ...

  7. 【C#】Excel导出合并行和列并动态加载行与列

    简单的Excel导出比较好做,只要设置表头,循环在表格中赋值添加数据即可,但是如果表头是不固定的,并且个数是不确定的,这就需要根据查询出数据的特点来添加导出了. 导出效果图: 如上图所示,商品的个数是 ...

  8. 获取spring的ApplicationContext几种方式【转】

    转自:http://blog.sina.com.cn/s/blog_9c7ba64d0101evar.html Java类获取spring 容器的bean 常用的5种获取spring 中bean的方式 ...

  9. javascript判断是否按回车键

    function enterHandler(event){ var keyCode = event.keyCode ? event.keyCode : event.which ? event.whic ...

  10. mysql配置和管理(转载)

    MySQL的配置与管理 (2012-08-09 13:06:59) 转载▼ 标签: mysql 配置 管理 分类: MySQL 安装 yum -y install mysql-server   启动服 ...