数据库中的事务(Transaction)的四大特征原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),这里以一个银行转账的经典例子进行讲解,假设A和B各有1000元钱,有一个事务是A像B转200元。

目录

原子性(Atomicity)

一致性(Consistency)

隔离性(Isolation)

脏读

不可重复读

幻读

持久性(Durability)


原子性(Atomicity)

原子性时指事务是一个不可分割的整体,要么都发生,要么都不发生

上图的转账事务分为两个过程

首先对A:1000 - 200 = 800

然后对B:1000 + 200 = 1200

对于事务的原子性而言,A不仅要减少200元,而且B也要增加200元,或者是都不变,不能只减少或只增加

一致性(Consistency)

一致性是指,事务的前后数据必须保持一致,也就是说,刚开始A和B共2000元,他俩不管怎么转,总和都是2000元

操作前A:1000元 B:1000元

操作后A:800元 B:1200元

操作前后,A和B的总和都是2000,并没有因为转而改变总和,这就是一致性

隔离性(Isolation)

隔离性是指,当多个用户并发操作时,每个用户都是一个事务,多个事务之间互不影响,相互隔离

当发生并发操作时,我们需要考虑事务的隔离级别,分别是脏读、不可重复读和幻读,我们通过A向B赚200元同时C向B转100元来进行讲解

如果按正常的来讲结果应该是

对A:1000 - 200 = 800

对B:1000 + 200 = 1200

对C:1000 - 100 = 900

再对A:1200 + 100 = 1300

脏读

所谓脏读,是指一个事务读取了另一个事务未提交的数据,也就是

对A:1000 - 200 = 800 此时B还没有来得及更新为1200,C就读取了B为1000的值,进行了转钱操作

对B:1000 + 200 = 1200

对C:1000 - 100 = 900 在这里C已经读取了B的值,而且是1000

再对B:1000 + 100 = 1100 由于C在B更新之前读取了1000

这样一来,就把B的值给错赋值为1100,这就是脏读

不可重复读

所谓不可重复读,是指,在一个事务内,多次读取数据不一定相同

如果初始A、B和C的钱都是1000元,当我们第一次查询时,结果是

A:1000元 B:1000元 C:1000元

但是,当我们第二次读取的时候,来了个D,给B转了500元,所以我们查出来的结果是

A:1000元 B:1500元 C:1000元

导致了两次查询结果不同,这就是不可重复读

幻读

所谓幻读,就是一个事务内,读取了别的事务插入的数据,导致前后读取不一致

如果初始有A、B和C的钱都是1000元,当我们第一次查询时,结果是

A:1000元 B:1000元 C:1000元

但是,由于在数据库表中又加入了一个D其金额为500元,那么在次查询的时候,结果就是

A:1000元 B:1000元 C:1000元 D:500

持久性(Durability)

持久性是指一个事务一旦被提交,他对数据库中数据的改变是永久性的

如果在A向B转钱的时候,出现了断电等意外情况

对A:1000 - 200 = 800

对B:1000 + 200 = 1200

如果是事务还没有提交,出现了断电等意外情况,那么重启数据库后,数据库中A和B的值为

A:1000 B:1000

如果是事务已经提交了,出现了断电等意外情况,那么重启数据库后,数据库中A和B的值为

A:800 B:1200

宅在家里写数据库中事务(ACID)相关推荐

  1. 宅在家里写数据库中MD5加密

    在数据库中,为了保证信息的安全性,我们一般会采取加密的措施,这里讲解一个不可逆的加密方式--MD5,其实这是数据库中的一个函数,我们以一个student学生表进行演示 我们插入一条信息,其中对密码进行 ...

  2. 宅在家里写数据库中函数应用

    在数据库中,我们可以使用一些常用的内置函数来提升我们的工作效率,下面几个是在实际开发中用的比较多的 下面以一个result成绩表进行演示 count()计数,其语法是需要注明计数的字段,可以用*和1, ...

  3. 宅在家里写数据库中DML(增删改)

    DML(Data Manipulation Language)数据操纵语言,也就是我们常说的增删改. 这里以一个grade表进行增删改的演示 插入语句(insert) insert into 表名([ ...

  4. 宅在家里写数据库中排序和分页

    排序关键词是order by,其默认是升序,如果想要降序,只需加上desc,其语法就是order by后面加上要排序的字段,下面通过result成绩表进行演示 如果我们想要查询成绩的升序排序 如果我们 ...

  5. 宅在家里写数据库中联表查询

    联表查询的关键字是join,如果需要判断条件的话是join on(on后面加判断条件),这两个一般是成对出现的,这里以两个表的连接进行讲解,首先给出两个表,分别是student学生表和result成绩 ...

  6. 宅在家里写数据库中DQL(查询)

    DQL(Data QueryLanguage)数据查询语言,其对应SQL的select. 这里有一个学生(student)表 有一个学生科目(subject)表 有一个成绩(result)表 查询语句 ...

  7. mysql中decimal不能为空吗_程序员,知道Mysql中事务ACID的原理吗?

    点击上方"linkoffer", 选择关注公众号高薪职位第一时间送达 引言 照例,我们先来一个场景~ 面试官:"知道事务的四大特性么?" 你:"懂,A ...

  8. mysql数据库的事物日志在哪里_mysql数据库中事务日志的作用

    mysql数据库中事务日志的作用 发布时间:2020-06-28 18:13:39 来源:亿速云 阅读:98 作者:Leah 这篇文章将为大家详细讲解有关mysql数据库中事务日志的作用,文章内容质量 ...

  9. android 数据库 事务,Android数据库中事务操作方法之银行转账示例

    Android数据库中事务操作方法之银行转账示例 发布时间:2020-09-14 18:19:43 来源:脚本之家 阅读:79 作者:Qi_Yuan 本文实例讲述了Android数据库中事务操作方法之 ...

最新文章

  1. Hadoop虚拟机的jdk版本和本地eclipse的版本不一致怎么办
  2. Linux下添加新硬盘,分区及挂载
  3. makefile中的函数
  4. 强化学习笔记5:learningplanning, explorationexploitation
  5. linux部署redis集群遇到的问题
  6. 【ES11(2020)】新增数据类型 BigInt
  7. (个人使用)uni-app开发(官方资源)· 汇总
  8. The library 'SocialSDK_QQZone_2.jar' contains nat
  9. Typore快速插入图片
  10. 我的世界手机版javaui材质包_我的世界手机版大乱斗卡比模组
  11. zedgraph显示最小刻度_关于ZedGraph几个难点
  12. Unity Compute Shader入门(大量对象随机赋值颜色实验)
  13. VBA-获取指定行列最后一个非空单元格
  14. POJ 3322 Bloxorz I
  15. 算法 - 判断一个数是不是2的n次幂
  16. IOS条形码扫描技术实现
  17. 华为2019算法大赛CTR预估数据探索
  18. [Matlab]FIR滤波器设计:(基本窗函数FIR滤波器设计)
  19. SuperMap GIS的TIN地形数据处理十问
  20. 强化学习 | Multi Agents | Trust Region | HATRPO | HAPPO

热门文章

  1. UITableView 编辑和删除行
  2. 内网信息安全厂商对客户的误导
  3. 字符设备驱动程序之poll机制(韦大仙)
  4. Openlayer 3 的画图测量面积
  5. python 调用mysql存储过程返回结果集
  6. oracle ebs应用产品安全性-交叉验证规则
  7. springboot项目如何使用HikariCP(国际主流)做为数据源,gradle构建工具
  8. python怎么实现黑客攻击英国_注意!你的隐私就是这样被黑客获取的
  9. 2020年Web前端技术的三大趋势(干货)
  10. 前端为什么要工程化?