一文帮你彻底搞懂MVCC

文章目录

      • 1.MVCC简介
      • 2. MVCC实现
        • 1.隐藏字段
        • 2.undo_log日志
        • 3.ReadView

1.MVCC简介

MVCC,即Multi-Version Concurrency Control (多版本并发控制)。它是一种并发控制的方法,用于在多线程或多进程环境下,保证数据的一致性和可见性。
通俗的讲,数据库中同时存在多个版本的数据,并不是整个数据库的多个版本,而是某一条记录的多个版本同时存在,在某个事务对其进行操作的时候,需要查看这一条记录的隐藏列事务版本id,比对事务id并根据事物隔离级别去判断读取哪个版本的数据。
数据库隔离级别读已提交、可重复读都是基于MVCC实现的,相对于加锁简单粗暴的方式,它用更好的方式去处理读写冲突,能有效提高数据库并发性能。

2. MVCC实现

MVCC具体实现主要依赖于数据库记录中的隐式字段、undo_log日志、readview

1.隐藏字段

在这里插入图片描述

隐藏字段 含义
DB_TRX_ID 最近修改事务ID,记录插入这条记录或最后一次修改该记录的事务ID
DB_ROLL_PTR 回滚指针,指向这条记录的上一个版本,用于配合undolog,指向上一个版本
DB_ROW_ID 隐藏主键,如果表结构没有指定主键,将会生成该隐藏字段
2.undo_log日志

回滚日志,在insert、update、delete的时候产生的便于数据回滚的日志。
当insert的时候,产生的undolog日志只在回滚时需要,在事务提交后,可被立即删除。
而update、delete的时候,产生的undo log日志不仅在回滚时需要,mvcc版本访问也需要,不会立即被删除。
多个事务并行操作某一行数据时,不同事务对该行数据的修改会产生多个版本,然后通过回滚指针(roll_pointer),连成一个链表,这个链表就称为版本链。通过版本链,我们就可以看出事务版本号、表格隐藏的列和undo_log它们之间的关系。
一文帮你彻底搞懂MVCC_第1张图片
一文帮你彻底搞懂MVCC_第2张图片
一文帮你彻底搞懂MVCC_第3张图片

3.ReadView

Read View是什么?
它就是事务执行SQL语句时,产生的读视图。实际上在innodb中,每个SQL语句执行前都会得到一个Read View。
Read View有什么用?
它主要是用来做可见性判断的,即判断当前事务可见哪个版本的数据
当前读
读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。对于我们日常的操作,如:select … lock in share mode(共享锁),select… for update、update、insert、delete(排他锁)都是一种当前读。
快照读
简单的select(不加锁)就是快照读,快照读,读取的是记录数据的可见版本,有可能是历史数据,不加锁,是非阻塞读。

Read Committed:每次select,都生成一个快照读。
Repeatable Read:开启事务后第一个select语句才是快照读的地方。

Readview中包含了四个核心字段

字段 含义
m_ids 当前活跃的事务ID集合
min_trx_id 最小活跃事务ID
max_trx_id 预分配事务ID,当前最大事务ID+1(因为事务ID是自增的)
creator_trx_id Readview创建者的事务ID

版本链数据访问规则:
1.如果数据事务ID trx_id < min_limit_id,表明生成该版本的事务在生成Read View前,已经提交(因为事务ID是递增的),所以该版本可以被当前事务访问。
2.如果trx_id>= max_limit_id,表明生成该版本的事务在生成ReadView后才生成,所以该版本不可以被当前事务访问。
3.如果 min_limit_id = (1)如果m_ids包含trx_id,则代表Read View生成时刻,这个事务还未提交,但是如果数据的trx_id等于creator_trx_id的话,表明数据是自己生成的,因此是可见的。
(2)如果m_ids包含trx_id,并且trx_id不等于creator_trx_id,则Read View生成时,事务未提交,并且不是自己生产的,所以当前事务也是看不见的;
(3)如果m_ids不包含trx_id,则说明你这个事务在Read View生成之前就已经提交了,修改的结果,当前事务是能看见的。
一文帮你彻底搞懂MVCC_第4张图片
读已提交(RC)隔离级别
一文帮你彻底搞懂MVCC_第5张图片

一文帮你彻底搞懂MVCC_第6张图片
可重复读(RR)隔离级别
一文帮你彻底搞懂MVCC_第7张图片

你可能感兴趣的:(Java开发,数据库,java,mysql)