宅在家里写数据库中事务(ACID)
数据库中的事务(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)相关推荐
- 宅在家里写数据库中MD5加密
在数据库中,为了保证信息的安全性,我们一般会采取加密的措施,这里讲解一个不可逆的加密方式--MD5,其实这是数据库中的一个函数,我们以一个student学生表进行演示 我们插入一条信息,其中对密码进行 ...
- 宅在家里写数据库中函数应用
在数据库中,我们可以使用一些常用的内置函数来提升我们的工作效率,下面几个是在实际开发中用的比较多的 下面以一个result成绩表进行演示 count()计数,其语法是需要注明计数的字段,可以用*和1, ...
- 宅在家里写数据库中DML(增删改)
DML(Data Manipulation Language)数据操纵语言,也就是我们常说的增删改. 这里以一个grade表进行增删改的演示 插入语句(insert) insert into 表名([ ...
- 宅在家里写数据库中排序和分页
排序关键词是order by,其默认是升序,如果想要降序,只需加上desc,其语法就是order by后面加上要排序的字段,下面通过result成绩表进行演示 如果我们想要查询成绩的升序排序 如果我们 ...
- 宅在家里写数据库中联表查询
联表查询的关键字是join,如果需要判断条件的话是join on(on后面加判断条件),这两个一般是成对出现的,这里以两个表的连接进行讲解,首先给出两个表,分别是student学生表和result成绩 ...
- 宅在家里写数据库中DQL(查询)
DQL(Data QueryLanguage)数据查询语言,其对应SQL的select. 这里有一个学生(student)表 有一个学生科目(subject)表 有一个成绩(result)表 查询语句 ...
- mysql中decimal不能为空吗_程序员,知道Mysql中事务ACID的原理吗?
点击上方"linkoffer", 选择关注公众号高薪职位第一时间送达 引言 照例,我们先来一个场景~ 面试官:"知道事务的四大特性么?" 你:"懂,A ...
- mysql数据库的事物日志在哪里_mysql数据库中事务日志的作用
mysql数据库中事务日志的作用 发布时间:2020-06-28 18:13:39 来源:亿速云 阅读:98 作者:Leah 这篇文章将为大家详细讲解有关mysql数据库中事务日志的作用,文章内容质量 ...
- android 数据库 事务,Android数据库中事务操作方法之银行转账示例
Android数据库中事务操作方法之银行转账示例 发布时间:2020-09-14 18:19:43 来源:脚本之家 阅读:79 作者:Qi_Yuan 本文实例讲述了Android数据库中事务操作方法之 ...
最新文章
- Hadoop虚拟机的jdk版本和本地eclipse的版本不一致怎么办
- Linux下添加新硬盘,分区及挂载
- makefile中的函数
- 强化学习笔记5:learningplanning, explorationexploitation
- linux部署redis集群遇到的问题
- 【ES11(2020)】新增数据类型 BigInt
- (个人使用)uni-app开发(官方资源)· 汇总
- The library 'SocialSDK_QQZone_2.jar' contains nat
- Typore快速插入图片
- 我的世界手机版javaui材质包_我的世界手机版大乱斗卡比模组
- zedgraph显示最小刻度_关于ZedGraph几个难点
- Unity Compute Shader入门(大量对象随机赋值颜色实验)
- VBA-获取指定行列最后一个非空单元格
- POJ 3322 Bloxorz I
- 算法 - 判断一个数是不是2的n次幂
- IOS条形码扫描技术实现
- 华为2019算法大赛CTR预估数据探索
- [Matlab]FIR滤波器设计:(基本窗函数FIR滤波器设计)
- SuperMap GIS的TIN地形数据处理十问
- 强化学习 | Multi Agents | Trust Region | HATRPO | HAPPO