写在前面:

  默认情况下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. PCI(Payment Card Industry)合规

     PCI-DSS(Payment Card Industry-Data Security Standard) 1.构建并维护安全的网络 2.保护持卡人数据 3.维护漏洞管理程序 4.执行严格的访问控制 ...

  2. java while循环语句

    //循环语句 //符合条件,循环继续执行,否则循环退出. //特点: //先判断,后执行 public class Test16{ public static void main(String arg ...

  3. 安装xenapp后,非管理员连接RDP出现桌面当前不可用的解决方法

    安装完xenapp后,非管理员帐号就不能远程登录到2008服务器. 修改方法如下:1.启动 Citrix AppCenter展开citrix资源.Xenapp.<场地>.策略,右面的窗格切 ...

  4. 基于Echarts的股票K线图展示

    发布时间:2018-10-31   技术:javascript+html5+canvas   概述 基于echarts的股票K线图展示,只需引用单个插件,通过简单配置,导入数据,即可实现炫酷复杂的K线 ...

  5. Swift 互斥锁写法

    oc中的互斥锁@synchronized(self) { //需要执行的代码块} swift中的互斥锁objc_sync_enter(self)//需要执行的代码块objc_sync_exit(sel ...

  6. jenkins和gitlab结合的时候出错

    Started by user zhaoliang Building in workspace /var/lib/jenkins/workspace/ZuoYeah_Static_Production ...

  7. find -exec 与xargs 区别

    find . -name "*.txt" -exec rm {} \;find . -name "*.txt" | xargs rm {} -exec    1 ...

  8. mysqlsla快速入门

    小强软件测试,因为不是天生丽质,所以必须天生励志. 性能.python自动化班长期招生,咨询QQ:2083503238 官网:http://xqtesting.sxl.cn QQ群:229390571 ...

  9. 关于使用coreseek并为其做分页的介绍(转)

    coreseek 做分页时找数据总量还真不好找.以为他会给一个方法(函数)什么的去获取,结果却不是.首先需要了解:num_matches: 当前返回的结果数,<= limit设置值.max_ma ...

  10. 【Java】Swing中JTextPane中如何绘制行号

    Oracle在JTextPane类中并没有直接提供显示行号的方法,所以这个功能应该由程序员自己来完成,笔者发现网上很多的显示行号的代码都存在一个问题,就是不准确,特别是在行数变多了以后. 笔者先贴出代 ...