MySQL的MVCC

目录

1.MVCC基本概念

1.当前读:

2.快照读:

 3.MVCC:Multi-Version Concurrency Control,多版本并发控制:

2.MVCC实现原理-三个隐藏字段

3.MVCC实现原理-undo log日志

1.undo log:回滚日志

2.undo log版本链

4.MVCC实现原理:readView

1.ReadView,读视图:

2.版本链数据访问规则

5.不同隔离级别下的readView

1.在RC,Read Committed下:

2.在RR,Repeatable Read下:

6.MVCC+锁:


1.MVCC基本概念


1.当前读:

        读取的是记录的最新版本,读取时保证其他并发事务无法修改当前记录,会对读取的记录加锁


2.快照读:

        读取的是记录的可见版本,可能是历史数据,不加锁,比如简单的select就是快照读
    * 默认的隔离级别下:开启事务后第一个select语句就是快照读的地方,后续select时查询的就是快照数据
    * 是非阻塞读的,因为都可以读到快照数据

  
3.MVCC:Multi-Version Concurrency Control,多版本并发控制:

        指维护一个数据的多个版本,使得读写操作没有冲突
    * 快照读就为MVCC提供了一个非阻塞读功能
    * MVCC的实现原理:数据库中的三个隐式字段、undo log日志、readView

2.MVCC实现原理-三个隐藏字段


* 记录中的隐藏字段

* 两个或者三个(DB_ROW_ID是没有主键才会自动生成的)

MySQL的MVCC_第1张图片

3.MVCC实现原理-undo log日志


1.undo log:回滚日志


    * 在insert、update、delete时产生的便于数据回滚的日志
    * insert时,产生的undo log只在回滚时需要,事务提交后,可以立即删除
    * update、delete时,产生的undo log日志不仅在回滚时需要,快照读时也需要,不会立即删除


2.undo log版本链


    * 不同事务对同一条记录进行修改,会导致该记录的undo log生成一条记录版本链条,链条的头部是最新的旧记录,链条的尾部是最早的旧记录

4.MVCC实现原理:readView


1.ReadView,读视图:

是快照读SQL执行时MVCC提取数据的依据,记录并维护当前活跃(未提交)的事务ID
  简单来说:快照读在读取时可以读取历史版本,而undo log日志形成的版本链产生了很多历史记录,readView是用来判断读取哪一个历史记录的
* readView包含四个核心字段:

MySQL的MVCC_第2张图片

2.版本链数据访问规则


    * trx_id:当前事务id

MySQL的MVCC_第3张图片

5.不同隔离级别下的readView

1.在RC,Read Committed下:

        事务中每一次执行快照读生成ReadView

MySQL的MVCC_第4张图片

2.在RR,Repeatable Read下:

        仅在事务中第一次执行快照读时生成ReadView,后续复用该ReadView(同一个事务中读取两条相同数据是一样的,从而保证可重复读)

6.MVCC+锁:

        保证了事务的隔离性和一致性

你可能感兴趣的:(Java日常学习,oracle,数据库)