MySQL进阶-MVCC

MySQL进阶-MVCC

Jason Lv3

基本概念

1.当前读

当前读就是读取记录的最新版本,读取时还要加上锁,导致其他并发事务无法访问该记录,从而阻塞其他并发事务,因此,其并发度最低。

1
select * from t where ? lock in share mode;

2.快照读

快照读读取的是记录的可见版本(不一定是最新的),这个读取是基于快照的,即不加锁的。快照读不依赖事务的状态,也不依赖事务的隔离级别,因此,其并发性能最好,但是,其读取的数据可能是过时的。

1
select * from t where ?;

3.MVCC

维护一个数据的多个版本,使得读写没有冲突。其具体实现,依赖于数据库记录中的三个隐字段、undo日志、ReadView。

实现原理

  • 隐藏字段
    在每行记录后添加两个隐藏列,分别是
    DB_TRX_ID:事务ID
    DB_ROLL_PTR:回滚指针指向记录的上一个版本,用于配合undo log,指向上一个版本。
    DB_ROW_ID:隐藏主键,用于在undo log中定位记录,如果表中没有主键,则会生成一个隐藏的自增ID。
  • undo日志
    在修改操作时,不仅记录当前数据的日志,还要记录修改前的日志。修改时记录当前的数据到undolog
    undo log
  • ReadView
    ReadView记录了系统当前活跃事务的ID列表,包含一下四个字段:
    1. m_ids:当前活跃的事务ID集合
    2. min_trx_id:最小活跃事务ID
    3. max_trx_id:预分配事务ID,当前最大事务+1(因为事务ID是自增的)
    4. creator_trx_id:ReadView创建者的事务ID

readView

  • 在RC隔离级别下的执行过程
    readView

4.事务隔离与一致原理

readView

🔚总结

  • MVCC+锁实现隔离
  • redolog实现持久化+undolog实现回滚==>事务的持久性 一致 原子

    redolog(重做日志)是数据库中的一种日志文件,用于记录数据库中发生的所有更改操作,以便在发生故障时进行恢复。它记录了所有已提交的事务所做的更改,以及在故障恢复期间未提交的事务所做的更改。
    undolog(撤消日志)是数据库中的另一种日志文件,用于记录在事务回滚期间需要撤消的更改操作。当需要回滚一个事务时,数据库会使用undolog来撤消该事务所做的更改,以便将数据库恢复到回滚之前的状态。

  • Title: MySQL进阶-MVCC
  • Author: Jason
  • Created at : 2023-09-06 10:54:46
  • Updated at : 2023-09-10 15:31:27
  • Link: https://xxxijason1201.github.io/2023/09/06/MySQL/MVCC/
  • License: This work is licensed under CC BY-NC-SA 4.0.
 Comments