当执行 select 操作时候:
针对这句话的理解,那一个事务未提交的情况下,又创建了新的事务,那这个事务的版本号是比之前未提交的事务高吗?那这样之前未提交事务的修改或者插入也能在当前事务下查询出来,是不是有点问题。还是要怎么理解。
感觉没有弄懂 MVCC 的工作机制。有点混乱,求解答。
1
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/ |
2
arrow8899 2019-09-24 16:06:56 +08:00
事务开始之前,会记录当前 active 的所有事务 id => ids,读取数据的时候从版本链中选择比 min(ids) 小的版本号;由于版本号递增,也就是当前正在执行的事务产生的修改对其它事务是不可见的。
|
3
DonaldY 2019-09-24 16:44:43 +08:00
感觉是:`只查找版本早于当前事务版本的数据行。` 这个理解有误。
查找到的是 最新已提交事务版本号记录。 未提交的是不可见的。ACID 再看下吧 |