图解并发事务脏读,不可重复读,幻读和隔离级别

一、区别脏读,不可重复读,幻读

脏读
       主要体现在一个事务读取了另一未提交的事物数据,由于并发处理,时间线不同,很容易出现这种问题。

不可重复读
       主要体现在一个事务中因为另一事务修改了所要查询的数据,导致两次读取同一数据不同。

请添加图片描述

幻读
       幻读最容易和不可重复读混淆,看起来两者都是同一事物中两次操作结果集不同,但其实幻读并不是说两次读取获取的结果集不同,幻读侧重的方面是某一次的 select 操作得到的结果所表征的数据状态无法支撑后续的业务操作。更为具体一些:select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入,此时就发生了幻读。
总结:不可重复读侧重于update;
          幻读侧重于insert和drop;

在这里插入图片描述

二、隔离级别

隔离级别脏读不可重复读幻读
Read-Uncommited(RU)
Read-Commited(RC)×
RepeaTable-Read(RR)××
Serialiable(RU)×××
  • Read-Uncommited(RU)(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能导致脏读、幻读或不可重复读。这个级别无疑是效率最高的,但同时也是出问题最多的级别,因为他完全就没有加锁限制。

    并发时像是一大堆的人去哄抢集市摊位上的蔬菜,前面的人把黄瓜抢光了,后面的人还在往前死命的挤,小贩同时也在给好几个人称菜卖。
  • Serialiable(可串行化): 最高的事务隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事物之间就可以完全不可能产生打扰,也就是说该级别可以防止脏读,不可重复读,幻读。 这个级别是效率最低,但是也是最安全的,并发读时加共享锁,其他事务只能读,而不能修改;并发写时加排它锁,其他事务既不能读也不能写。

    接上面的例子,摊主让所有人排队买菜,一个一个买,后面排队的想要知道还有没有黄瓜可以对小贩喊一声问,但是小贩招待排在第一个的顾客,给第一个人称菜而且在说还有什么菜时是无暇顾及其他人的呼求的
  • Read-Commited(读取已提交): 允许读取并发事务已经提交的数据,可以防止脏读,但是幻读或不可重复读仍然有可能发生。

    接第一个例子,允许后面哄抢等待买菜的人问小贩黄瓜还有吗,小贩每次告知后面的人菜的数量都是排除掉第一个人已经要买的菜的数量,后面的人就知道还剩下多少黄瓜。
  • RepaaTable-Read(可重复读): 对同一字段的多次读取结果都是一致的,除非是数据被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。

    接第一个例子,当第一个买菜的时候不会提前卖给其他人,也就是说,小贩只专注于给这一个顾客卖,其他人暂时不接待。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值