美文网首页
Mysql的MVCC原理详解-最通俗易懂的话

Mysql的MVCC原理详解-最通俗易懂的话

作者: 三个程序员之一 | 来源:发表于2023-02-20 12:21 被阅读0次

    1.MVCC实现是为了针对RC和RR这两个事务隔离级别。

    声明概念。所谓RR就是可以重复读。意思就是 说在一个事物代码中 会遇到对同一个数据两次查询的问题,比如你第一次查询的时候数据是5。然后执行下面业务处理,在进行第二次业务查询之前有其他的业务把数据改成了3,但是 你实际进行第二次查询的时候数据依然是5。因为第一次和第二次查询的结果是相同的所以叫 可以重复读。 指的就是可以读到第一次查询的结果,不会被中间其他事物修改这条记录干扰第一次是什么就是什么。

    RC就是不可重复读 和上面的流程一样 唯一区别就是。第二次执行之前有事物修改成3了 那么。 RC的事物隔离级别是可以看到最新的事物提交的数据。所以第二次查询出来是3 ,第二次和第一次查询结果不一样,所以叫对第一次的查询的不可以重复读到。

    2.首先需要了解数据库事务id是自增的,而且事务id创建只有在触发增删改的时候才会出现,单纯做一个事物开启是不会创建事物id的。所以这里有个关键是只有代码执行到第一次的增删改就会创建事务id

    3.下面需要了解一下mysql的有个叫undo log的记录他的记录大概是如下方式

    比如我有一个用户表 只有 id和name字段。undo log会记录我每次的修改记录

    第二次修改 id是1。 name是小7。 事物号第一次事物号 5。 id都是1是 因为记录的是对同一个数据的修改所以id都是1

    第一次修改 id是1。 name是张5。 事物号第一次事物号 2。 因为事物号是自增的但是不一定就是2也许是3或者其他

    第一次插入 id 是1。 name是张三。 事物号第一次事物号 1

    PS :上面介绍的undo log存储结构用于理解因为实际上可能第一次插入可能存储的就是数据id或者地址之类的东西因为设计者肯定会考虑空间问题,不会进行无脑复制吧。具体细节不是特别清楚但是大概逻辑是对的。细节可以参考其他优秀文章。

    然后他们的关系是第一次修改指向第一次插入,第二次修改指向第一次修改。这样就形成了一条链。

    然后重点来了。
    RR隔离级别在开启事务后。 第一次进行这个数据查询的瞬间会 形成一个 叫ReadView的一个视图

    这个所谓的视图主要记录了
    1)在查询这个瞬间 当前数据库 有多少个事物正在 执行着 没有执行完(正在执行的事物没有提交) 比如3和4事物id正在执行。

    2)与此同时 在同一时刻找到数据库中的最大事务的id。比如是10

    然后就开始愉快的查询了,开始进行和 undo的数据比较。

    RR: 情况
    这是第一次查询
    因为事物id是自增的 所以 你上面都拿到了那个最大的事物ID了。所以 就用这个最大事物id向下找 比如10是最大的 但是执行中的事物还没有10 那么10就是执行完的事物,如果10这个事物修改了你的查询记录那么就是10, 没有就接着找9 ,查找过程中遇到我们当时执行的事物那个34就跳过因为他们是执行中的都没有提交肯定不要啊,所以直到找到符合修改当前查询数据的合适数据为止。

    第二次查询假如上面讲的第一次查询和第二次查询之间数据已经被修改了 undo中肯定会有记录
    那么为什么 第二次查出来的 还是原来第一次查询的数据呢,
    我第二次查询的时候 我因为用的是第一次的查询记录的 ReadView信息 那么 判断条件是相同的所以查出来的数据当然相同了。
    即使两次查询中间过程中34事物执行完了对数据进行了修改但是,我因为我对比条件用的还是一次的所以还是看不到34事务的数据

    即使是最新的事物修改。那么最新的事物号肯定大于当时的10这个事物号 所以不在查询考虑范围内。

    RC:情况

    RC是因为在同一个事物中 每次(这个每次是关键) 查询 都会创建最新的ReadView所以 每次比对都和 RR第一次查询那样去比对。 所以 因为ReadView每次都是最新的数据。当然每次查询的数据就不一样了。但是RC因为比较的时候 也是 不包含的当前执行的事物了。所以没有脏读的问题。 主要和RR区别就是 每次查询重新生成视图。 这个就是本质上的区别了

    希望我的 特别通俗易懂的话能帮到你某个没想明白的点。来辅助你去看高手写的帖子而更容易理解。

    如果帮到了你希望给我一个赞这是写下去的动力。

    相关文章

      网友评论

          本文标题:Mysql的MVCC原理详解-最通俗易懂的话

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