快照读和当前读

快照读
快照读 即:snapshot read,官方叫法是:Consistent Nonlocking Reads,即:一致性非锁定读,官方的解释是 :InnoDB 通过 MVCC(多版本控制)将数据库在过去某个时刻的快照应用在查询上,使得:这次查询 只能看到 别的事务在生成快照前提交的数据,而不能看到 别的事务在生成快照后提交的数据或者未提交的数据。
简单理解为 快照读读取的是记录的可见版本 (有可能是历史版本)

快照读 好处是:读不加锁,读写不冲突,这个对于 MySQL 并发访问提升很大。
mvcc所提到的读是快照读,也就是普通的select语句

当前读
当前读读取的是记录的最新版本(最新数据,而不是历史版本的数据),读取时需要保证其他并发事务不能修改当前记录,所以会对读取的记录进行加锁。在一个事务执行的过程中,如果我们这个时候使用了DML语句(既insert、update、delete)或加锁的select,此时SQL语句会执行当前读,它们会在操作数据库内容之前,去读取数据库中当前时间点以及提交的最新的数据,基于的基础上,在最新的数据上去执行DML语句的逻辑。此时的这个读取数据库中最新已提交的数据的这个动作,就是当前读。
主要包括以下几种操作:
select lock in share mode(共享锁)
select for update(排他锁)
update(排他锁)
insert(排他锁)
delete(排他锁)

幻读问题
幻读:一个事务中,由于其他事务的并发操作(插入或删除),导致相同的查询语句在不同时间点返回不同的结果集
在快照读时:通过mvcc,RR的隔离级别解决了幻读问题,因为每次使用的都是同一个readview。
在当前读时:通过next-key锁(行锁+gap锁)解决幻读问题

MySQL在RR隔离级别下,是有可能会发生幻读的。但需要具备一定的条件才能触发:1.在一个事务当中,同时使用到快照读和当前读。
2.同时其他事务刚好有插入数据的操作发生且已提交。
3.当前读在当前事务中发生的时间点是在其他事务插入数据且提交之后。
4.在当前事务中再次执行快照读或当前读的时候,如果查询条件搜索的范围刚好可以包含其他事务插入的数据,则会发生幻读。
比如下图所示:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值