<高性能 MySQL>对 MVCC 的描述

2019-09-24 15:39:05 +08:00
 Renco

当执行 select 操作时候:

  1. 只查找版本早于当前事务版本的数据行。 确保事务读取的行,在事务开始之前就存在的,或者是事务自身插入或者修改过的。
  2. 行的删除版本号要么未定义,要么大于当前事务版本号。 确保事务查询到的行,在事务开始之前没被删除。

针对这句话的理解,那一个事务未提交的情况下,又创建了新的事务,那这个事务的版本号是比之前未提交的事务高吗?那这样之前未提交事务的修改或者插入也能在当前事务下查询出来,是不是有点问题。还是要怎么理解。

感觉没有弄懂 MVCC 的工作机制。有点混乱,求解答。

1937 次点击
所在节点    数据库
3 条回复
polythene
2019-09-24 15:47:58 +08:00
这个要看隔离级别了,未提交的事务是有可能被查出来,那是在 Read Uncommitted 情况下。所以你的问题应该是:MySQL 的隔离级别是怎样实现的。

我没有看过 MySQL 源代码,但同样用了 MVCC 的 etcd 我知道它是怎么做隔离的,最近刚好写了一篇介绍,希望能帮助你理解: http://blog.betacat.io/post/2019/08/learn-transaction-isolation-levels-from-etcd/
arrow8899
2019-09-24 16:06:56 +08:00
事务开始之前,会记录当前 active 的所有事务 id => ids,读取数据的时候从版本链中选择比 min(ids) 小的版本号;由于版本号递增,也就是当前正在执行的事务产生的修改对其它事务是不可见的。
DonaldY
2019-09-24 16:44:43 +08:00
感觉是:`只查找版本早于当前事务版本的数据行。` 这个理解有误。

查找到的是 最新已提交事务版本号记录。

未提交的是不可见的。ACID 再看下吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/603744

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX