• 许童童
    2019-08-21
    我来回答一下思考题:
    为什么隔离级别为读未提交时,不适用于 MVCC 机制呢?
    因为隔离级别是读未提交,所以跟本就不需要版本控制,直接读取最新的数据就好了。

    读已提交和可重复读这两个隔离级别的 Read View 策略有何不同?
    读已提交每一次Select都会重新查询Read View,保证可以读到其它事务的提交。
    可重复读会复用第一次查询到的Read View,不会读到其它事务的提交,加上Next-Key锁的配合,从而避免幻读。
    展开

    作者回复: 对的 读未提交不需要版本控制

     2
     11
  • 老毕
    2019-08-24
    1. 为什么隔离级别为读未提交时,不适用于 MVCC 机制呢?

    “读未提交”隔离级别不需要多版本数据。每个事务都读取最新数据,假设事务A把X从0改成1,无论事务A是否提交,事务B读到X为1,如果事务A回滚,事务B再次读X,自然就得到0,根本不需要MVCC帮衬。

    2. 读已提交和可重复读这两个隔离级别的 Read View 策略有何不同?

    “读已提交”时,每次SELECT操作都创建Read View,无论SELECT是否相同,所以可能出现前后两次读到的结果不等,即不可重复读。
    “可重复读”时,首次SELECT操作才创建Read View并复用给后续的相同SELECT操作,前后两次读到的结果一定相等,避免了不可重复读。
    展开

    作者回复: 对的 分析总结的很好

    
     6
  • asdf100
    2019-08-21
    如图所示,trx_ids 为 trx2、trx3、trx5 和 trx8 的集合,活跃的最大事务 ID(low_limit_id)为 trx10,活跃的最小事务 ID(up_limit_id)为 trx4。

    没理解这个10和4怎么来的,不是说就2 3 5 8这个活跃事务吗?
     2
     5
  • Yuhui
    2019-09-26
    请教老师以下几个问题:
    1. MVCC机制在各个数据库中默认是打开的还是关闭的?
    2. 是否可以控制MVCC机制的打开和关闭?
    3. 如何查看数据记录的隐藏列?
    谢谢!
    
     2
  • 空知
    2019-08-31
    老师 问下:
    1、如果RV不符合 就需要去Undo Log里面去判断快照记录了,这里对于快照记录 会一直比较下去直到找到一个可见版本 或者查询全部历史版本为止?
    2、间隙锁 锁住一个范围不包含 行记录本身,是指 对某条记录添加间隙锁之后 还可以针对这条记录本身做修改操作吗?
    
     2
  • 安静的boy
    2019-08-23
    想说一下最后一个列子,innodb是如何解决幻读的。作者举的例子是innodb在当前读的情况下如何解决幻读(通过加next-key 锁)。如果在快照读下,利用readView就可以解决了。
    
     2
  • Ryoma
    2019-09-19
    如果有的同学看了前面的,没有看到这一章 MVCC。是不是就会产生误解,比如 MySQL Innodb 在可重复读隔离级别下,会发生幻读现象?这类观点,在之前说的时候,是不是需要提前说一下?
    
     1
  • 饭团
    2020-01-08
    重读第二遍 才理解了真谛 真是读书百遍 其义自见!
    
    
  • rike
    2020-01-07
    事务并发处理的3个异常,在15讲中的例子我试了,把事务隔离级别修改后,事务隔离级别与事务并发处理图中的现象与实际的执行结果无法对应,我上网查了很多文章,看不明白,也询问了一些dba,他们都讲不明白,他们说事务并发处理的3个异常区别不是很大,他们只是停留在理论的层面上,因为数据库不是我开发的,这个我也不懂。
    
    
  • ballgod
    2019-12-24
    老师您好,为了解决幻读问题,解决方法是有两种:1)设置串行化 2)设置为可重复读,同时采用mvcc + next-key解决。第一种是可以通过设置隔离方式实现。第二种是如何实现?是设置为可重复读后然后再怎么操作才能使用mvcc机制或者说具体是如何实现? 不知道这样表述是否正确,麻烦老师指点,谢谢
    
    
  • 朱成亮
    2019-12-10
    这块有点难~

    作者回复: 对的 稍微有些难理解,慢慢来

    
    
  • GLADIATOR
    2019-09-30
    MySQL可重复读加next key是可以解决幻读的
    
    
  • 峻铭
    2019-09-26
    测试结果发现比2.08矮的插入是也会阻塞
    
    
  • L荀
    2019-09-23
    不理解的请教下作者大神:1.可重复读级别下,新加入的行,版本号高于当前事物版本号,不用next-key锁,应该也不会出现幻读,这个怎么理解啊。2.例子中为什么加了for update 读锁呀,不是应该不用锁的么
    
    
  • study~
    2019-09-17
    既然 事务A已经上了 排他锁,,其他用户怎么可以对上锁的记录进行修改?
     1
    
  • innovationmech
    2019-09-16
    看了几遍文章和留言,有点懂了。。。

    作者回复: 加油

    
    
  • Leon📷
    2019-09-12
    在 Read VIew 中有几个重要的属性:

    trx_ids,系统当前正在活跃的事务 ID 集合。这个事务ID集合是针对这一行的事物集合吧,不是整个mysql的系统事务集合
    
    
  • Alpha
    2019-08-21
    Step 4. 如果不符合Read View 规则,就需要从Undo Log中获取历史快照。不太明白这里的"Read View规则"指的是什么?

    作者回复: Read View的规则:
    如果 trx_id < 活跃的最小事务 ID(up_limit_id),也就是说这个行记录在这些活跃的事务创建之前就已经提交了,那么这个行记录对该事务是可见的。

    如果 trx_id > 活跃的最大事务 ID(low_limit_id),这说明该行记录在这些活跃的事务创建之后才创建,那么这个行记录对当前事务不可见。

    如果 up_limit_id < trx_id < low_limit_id,说明该行记录所在的事务 trx_id 在目前 creator_trx_id 这个事务创建的时候,可能还处于活跃的状态,因此我们需要在 trx_ids 集合中进行遍历,如果 trx_id 存在于 trx_ids 集合中,证明这个事务 trx_id 还处于活跃状态,不可见。否则,如果 trx_id 不存在于 trx_ids 集合中,证明事务 trx_id 已经提交了,该行记录可见。

     1
    
  • humor
    2019-08-21
    InnoDB的MVCC不可以防止出现幻读吗?比如文中的例子,A事件在开启的时候,B事务还没有提交,在A事件执行的过程中B事务提交了,在A事务读取数据的时候,通过查询Read View,应该会发现B提交的行记录是活跃的或者未提交的事务id,所以就算没有Next-key锁,A事务也读不到B事务提交的数据吧?
    
    
  • LW
    2019-08-21
    读未提交的意思就是所有更新都可见,所以没必要用MVCC机制了。读已提交每次读都要检查当前的活跃事务更新Read View,保证可以读到其他事务提交的最新数据。可重复读的Read View是记录当前事务开始时的活跃事务,这样在当前事务处理期间,才能避免其他事务提交后出现幻读。
    
    
我们在线,来聊聊吧