MySQL--MVCC

MVCC 实现原理

总结:

  • 并发事务在操作资源的时候,存在着三种操作,分别为: 读读操作读写操作写写操作,这三种操作可能带来脏读不可重复读幻读的问题。使用锁能够解决这些问题,但是,加锁每次只能有一个事务操作资源,会导致数据库性能不佳。因此就有了MVCC。

  • MVCC指的是多版本并发控制

  • 使用目的: 通过记录多个修改的历史版本替代锁,实现事务间的隔离效果,保证非阻塞读。

  • MVCC的两种读方式:

    • 当前读: 总是读取到最新版本的数据;
    • 快照读: 读取的是历史版本记录。
  • MVCC的实现核心

    • 表的隐藏列: 记录事务id以及上一个版本数据的地址;

    • undo log: 记录数据各版本修改历史,也即为事务链;

    • Read View: 读视图,用于判断那些版本是可见的。

      • trx_list: 未提交的事务ID数组;
      • up_limit_id : 数组中事务最小的id;
      • low_limit_id: ReadView生成时刻系统尚未分配的下一个事务ID,也就是目前已出现过的事务ID的最大值+1。
    • 当前事务是如何判断那些版本是可见的呢?有以下规则:

      • 不在未提交的事务数组中,并且事务ID< Max或者是自己,对于当前的事务都可见。

MySQL--MVCC

  • 如果新提交了事务,并且当前事务的隔离级别是RC(读已提交),则会重新拿ReadView,读取最新的版本数据。
  • 如果新提交了事务,并且当前事务的隔离级别为RR(可重复读) ,则不会重新拿ReadView,读取的还是最开始的历史版本数据。

因此在上面的例子中,如果数据库的事务隔离级别为RC 则结果为 100 108 可见,108 是新提交的事务,ReadView会重新加载

而如果数据库事务隔离级别为RR,则只有100 可见,ReadView还是最开始的历史版本数据。

参考内容:码农架构: https://www.bilibili.com/video/BV1tV411y7sU

上一篇:checkboxlist 下拉框多选功能 ,模拟dropdownlist带复选框效果


下一篇:mysql事物