先了解清楚 脏读、不可重复读、幻读,再谈事务隔离机制

简介: 先了解清楚 脏读、不可重复读、幻读,再谈事务隔离机制

前言



在大谈事务隔离机制前,我们务必要了解   脏读、不可重复读、幻读 。


因为事务隔离机制,就是为了给我们选择权利去规避脏读、不可重复读、幻读。


如果我们连问题是什么东西都不清楚,那去了解解决各问题的方案,是不是草率了。


所以,该篇内容主要是想用些通俗易懂的话语结合实例去 描述下,


什么是脏读?


什么是不可重复读?


什么是幻读?


正文



一.什么是脏读?


举个例子


我和你的操作分别代表两个不同的事务操作(提交事务才算完成一个事务所做的事情)。

咱们公用一个钱包(共享经济),里面没有钱。


你 执行一个事务操作,往钱包里面放入 30块钱(还未提交) 。


我 执行一个事务操作,查询 钱包里面有30块钱,开心,立刻下订单,点两倍奶茶 。


你 神经兮兮地反悔了,放入 30块钱的事务操作没有提交(或者回滚了)。


我 后面没有继续查询钱包的钱了,一直以为里面有30块钱呢, 然后外卖来了, 奶茶是凉的,我也是凉的。


文字描述


事务 A 的未提交(还依然缓存)的数据被 事务 B 读走,如果 事务 A 失败回滚,会导致 事务 B 所读取的的数据是错误的。


二.什么是不可重复读?


举个例子


我和你的操作分别代表两个不同的事务操作。


咱们公用一个钱包(共享经济),里面有100块钱。


我 执行的事务 操作是,先看一眼钱包里面的钱, 然后跟别人说我的财富是多少多少(直接吹起来了),然后吹完后还看一眼钱包里面的钱(依依不舍)。  (同一个事务里面包含两次查询,两次查询存在间隙)


而你执行 的操作是, 悄咪咪地动了钱包的钱。(修改操作)


场景,


我第一次看钱包里面的钱, 是100块, 直接开始自信吹水,我有100块呢,奶茶随便喝。


我吹的正起劲,你悄咪咪地 取走了钱包里面的 90块。


我吹水吹完了,准备再看一眼钱包的钱,结果发现,咦? 怎么只有10块? 我看多了一个零吗??? 钱包是瘪的,我也是瘪的。


文字描述


事务A 中 包含 两次(多次)读取数据值操作, 而事务B 在A的读取操作之间 修改数据,导致事务A 读取的数据存在不一致的混乱情况。


三.什么是幻读?


举个例子


我和你的操作分别代表两个不同的事务操作。


咱们公用一个钱包(共享经济),原本有100块钱,然后买奶茶用了30块,剩下70块。


大家都能看到    这条消费记录 :       买奶茶 使用   30元 ,钱包钱数   -  30 元 。


我 执行的事务操作是, 先看一眼 钱包的消费记录,

(心里开始计算总额减去每一条消费记录里面的钱,剩下多少钱)


然后开始吹我们勤俭节约,开始计划剩下的钱怎么用。然后吹完后 还看一眼钱包的消费记录(依依不舍)。


(同一个事务里面包含两次查询,两次查询存在间隙)


你 执行的事务操作是,悄咪咪地消费了几次,新增了好几条消费记录。(新增/删除)


场景,


我第一次看钱包里面的消费记录,只有一条记录,心里神算子附身,直接计算出 100块减去这30块,那还有70块~


开始疯狂吹水,感觉我们很节约,然后还开始计划后续怎么动用这笔巨款,计划表都写好了。


在我在那叭叭叭吹水和写计划表的时候, 你悄咪咪地去消费了几把, 消费记录 -10元; -5元 ; -15元;


等我写完,再去留恋一把,看一下消费记录,我人傻了。 不是只有一条数据么? 怎么这么多条???


细细一看,是不是觉得 不可重复读  和 幻读 ,这两个很相似?


确实, 不可重复读 注重的是 数据值; 而 幻读 更注重的是 数据集的数量。


也就是说,不可重复读其实 被影响多是 被 修改操作影响;


而 幻读 其实 被影响多是 被 新增操作影响(删除目前大多数也只是一个flag值了)。


Spring事务隔离机制 相比 数据库事务隔离机制其实也就多一个 default 。


image.png

相关文章
|
2月前
|
SQL 关系型数据库 MySQL
事务及事务的隔离级别
事务及事务的隔离级别
|
2月前
|
SQL 关系型数据库 MySQL
对数据库事务理解以及脏读、不可重复读以及幻读问题
对数据库事务理解以及脏读、不可重复读以及幻读问题
|
2月前
|
SQL
事务的隔离级别
事务的隔离级别 多个事务之间隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题。设置不同隔离级别就可以解决 1.脏读:一个事务,读取到另一个事务中没有提交的数据 2.不可重复读,在同一个事务中,两次读取的数据不一样 3.幻读:(dml)一个事务操作数据表中记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改 隔离级别 1.read uncommitted:读未提交 产生问题:脏读、不可重复读、幻读 2.read committed:读已提交 产生问题:不可重复读、幻读 3.repeatable read:可重复读 产生问题:幻读 4.serializable:串行
27 0
|
12月前
|
数据库
数据库事务的并发问题 (脏读、幻读、不可重复读)
数据库事务的并发问题 (脏读、幻读、不可重复读)
95 0
|
12月前
|
算法 关系型数据库 MySQL
事务的隔离级别和对应的问题
事务的隔离级别和对应的问题
|
SQL Oracle 关系型数据库
数据库事务隔离级别
数据库事务隔离级别
105 0
图解脏读、幻读、不可重复读
图解脏读、幻读、不可重复读
59 0
|
关系型数据库 MySQL
你不能不知道的脏写,脏读,不可重复读,幻读超级详细解读
你不能不知道的脏写,脏读,不可重复读,幻读超级详细解读
你不能不知道的脏写,脏读,不可重复读,幻读超级详细解读
|
Java 数据库 开发者
事务的隔离级别|学习笔记
快速学习事务的隔离级别
84 0
|
关系型数据库 MySQL
解决并发事务造成的脏读,幻读,不可重复读问题
解决并发事务造成的脏读,幻读,不可重复读问题
114 0