美文网首页MysqlMySql
当前读与快照读

当前读与快照读

作者: 维特无忧堡 | 来源:发表于2018-07-29 17:29 被阅读1845次

前言

在这里记录一下一个博客,觉得写的很好 http://hedengcheng.com/?p=771

概念

快照读

  读取的是记录数据的可见版本(可能是过期的数据),不用加锁

当前读

  读取的是记录数据的最新版本,并且当前读返回的记录都会加上锁,保证其他事务不会再并发的修改这条记录
  概念说的比较虚,也不好理解,接着举一个例子吧,假设你开启了两个事务,分别是A和B,这里有个张表,user表,里面有四条数据


image.png

1、select快照读(照片)

  当你执行select *之后,在A与B事务中都会返回4条一样的数据,这是不用想的,当执行select的时候,innodb默认会执行快照读,相当于就是给你目前的状态找了一张照片,以后执行select 的时候就会返回当前照片里面的数据,当其他事务提交了也对你不造成影响,和你没关系,这就实现了可重复读了,那这个照片是什么时候生成的呢?不是开启事务的时候,是当你第一次执行select的时候,也就是说,当A开启了事务,然后没有执行任何操作,这时候B insert了一条数据然后commit,这时候A执行 select,那么返回的数据中就会有B添加的那条数据......之后无论再有其他事务commit都没有关系,因为照片已经生成了,而且不会再生成了,以后都会参考这张照片。

2、update、insert、delete 当前读

  当你执行这几个操作的时候默认会执行当前读,也就是会读取最新的记录,也就是别的事务提交的数据你也可以看到,这样很好理解啊,假设你要update一个记录,另一个事务已经delete这条数据并且commit了,这样不是会产生冲突吗,所以你update的时候肯定要知道最新的信息啊。

  我在这里介绍一下update的过程吧,首先会执行当前读,然后把返回的数据加锁,之后执行update。加锁是防止别的事务在这个时候对这条记录做什么,默认加的是排他锁,也就是你读都不可以,这样就可以保证数据不会出错了。但注意一点,就算你这里加了写锁,别的事务也还是能访问的,是不是很奇怪?数据库采取了一致性非锁定读,别的事务会去读取一个快照数据。
  innodb默认隔离级别是RR, 是通过MVVC来实现了,读方式有两种,执行select的时候是快照读,其余是当前读,所以,mvvc不能根本上解决幻读的情况

相关文章

  • mysql的幻读处理机制

    当前与快照读 当前与快照读 mysql的幻读处理机制 参考Mysql(Innodb)如何避免幻读我在mysql 8...

  • 当前读与快照读

    前言 在这里记录一下一个博客,觉得写的很好 http://hedengcheng.com/?p=771 , 概念...

  • MVCC原理机制

    目录 背景 前提回顾什么是MVCC什么是当前读和快照读当前读,快照读和MVCC关系MVCC,乐观锁,悲观锁关系 M...

  • mysql mvcc机制

    MVCC并发控制中,读操作可以分成两类:快照读 (snapshot read)与当前读 (current read...

  • MVCC多版本并发控制

    前提概要什么是MVCC什么是当前读和快照读?当前读,快照读和MVCC的关系 MVCC实现原理隐式字段undo日志R...

  • MVCC多版本并发控制

    前提概要什么是MVCC什么是当前读和快照读?当前读,快照读和MVCC的关系 MVCC实现原理隐式字段undo日志R...

  • MySQL/InnoDB 的事务隔离级别和锁

    事务的隔离级别 读分为快照读和当前读。用 MVCC 可解决快照读的脏读、幻读问题,不需要上锁。 Read Unco...

  • 快照读 当前读 MVCC

    MVCC MVCC (Multiversion Concurrency Control),即多版本并发控制技术,它...

  • 8.2 快照读,当前读

    当前读 这些是当前读: select...lock in share mode (就这个是共享锁)select.....

  • 快照读和当前读

    【MySQL】当前读、快照读、MVCChttps://www.cnblogs.com/wwcom123/p/107...

网友评论

    本文标题:当前读与快照读

    本文链接:https://www.haomeiwen.com/subject/hrxtvftx.html