写在前面:

  默认情况下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. Linux内核配置:定制配置选项

    很多嵌入式开发人员都需要在Linux内核中添加一些特性,以支持特别的定制硬件. ARM架构的顶层Kconfig文件中,可以看到一个名为System Type的菜单项.在ARM system type提 ...

  2. Spring+MyBatis纯注解零XML整合(4)

    不得不说,利用XML作为配置文件是一个非常好的想法,它可以轻松地实现配置集中化,而且修改之后无需再次编译.然而,由于大多数情况下开发者基本都会拿到程序的源码,加之对于各种XML配置文件一般情况下也只有 ...

  3. [转] Compile、Make和Build的区别

    针对Java的开发工具,一般都有Compile.Make和Build三个菜单项,完成的功能的都差不多,但是又有区别.   编译,是将源代码转换为可执行代码的过程.编译需要指定源文件和编译输出的文件路径 ...

  4. 算法笔记_217:黑洞数(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432,一个最小的数23456.求这两个数字的差,得:41 ...

  5. 算法笔记_216:第六届蓝桥杯软件类校赛部分真题(Java语言C组)

    目录 1 题目一 2 题目二 3 题目三 4 题目四 5 题目五 前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 题目一 二项式的系数规律,我国数学家很早就发现了. 如[图1.png],我国南宋数学 ...

  6. 开启mysql远程登录

    开发过程中经常遇到远程访问mysql的问题,每次都需要搜索,感觉太麻烦,这里记录下,也方便我以后查阅. 首先访问本机的mysql(用ssh登录终端,输入如下命令): mysql -uroot -p 输 ...

  7. Android tree应用框架

    简单介绍 一个好的Android应用开发框架,能够加快Android开发速度,今天笔记基于很多开源项目自写了一款Android应用框架. 内容 框架包含:界面管理(Activity管理).数据库操作( ...

  8. linux tftp 服务

    TFTP(Trivial File Transfer Protocol)是基于UDP协议开发,用来在客户机与server之间进行简单文件传输的协议,提供不复杂.开销不大的文件传输服务. 一.改动/et ...

  9. python 模块之platform模块(基本了解)

    # -*- coding: cp936 -*-#python 27#xiaodeng#python 模块之platform模块(基本了解)#获取底层平台的识别数据 #知道该模块用途即可,需要使用时直接 ...

  10. 洛谷 P1736 创意吃鱼法

    题目描述 题目链接:https://www.luogu.org/problemnew/show/P1736 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢( ...