java面试:了解MVCC么,详细解释一下

发布于:2025-09-09 ⋅ 阅读:(19) ⋅ 点赞:(0)

MVCC是一个多并发版本控制工具,通过这样一个工具类,可以帮我们解决脏读和不可重复读等问题,所以毫无疑问MVCC是一个高频的常考知识点,今天小编就分享一下MVCC的相关知识点,希望大家都能有所收获。

1.MVCC的定义

     MVCC的全称是Multi-Version Concurrency Control,中译是多版本并发控制是一种数据库管理系统中常用的并发控制机制,用于解决多个事务同时读写数据库时的冲突问题,用于提高并发性能。

     MVCC的核心思想是同时保存数据的多个版本,保证了不同的事务能读取到的数据版本是不同的,这样即使其他的事务在修改数据,也不影响事务读取事务,进而来解决脏读,不可重复读的问题。

2.MVCC的底层

     MVCC的底层是通过undolog日志和数据快照readview两项来组成的,通过undolog日志来记录同一数据的多个不同的数据版本,再通过数据快照readview来判断哪些事务提交的数据对当前的事务可见,接下来我们就对MVCC的设计思路和底层进行讲解。

     在了解MVCC的底层之前,我们需要先知道一件事,就是我们该如何判断一个事务的先后顺序,进而执行后续判断其他事务提交的数据是否对当前的事务可见,因此我们需要事务ID(持续递增)来记录事务执行的先后顺序,事务ID越小,说明事务执行的越早。

     MVCC的底层之一就是通过mysql日志undolog来实现同一个数据的不同版本控制,为了能够达成这样的一个效果,我们会对数据添加一个隐藏字段roll_pointer(回滚指针)来指向undolog日志,后通过回滚指针来将所有的历史数据都串联成一个链表,这样就可以通过回滚指针来查询同一个数据的不同版本,这样就实现了一个数据的多版本控制。

     MVCC的底层之一是通过数据快照readview来判断哪些事务的数据是对当前事务可见的,而一个readview当中,主要包含四个重要的信息字段:

  • creator_trx_id:创建当前readview的事务id

  • m_ids:当前在数据库活跃的但没有提交的事务列表

  • max_trx_id:当前系统最大事务 ID

  • min_trx_id:当前系统最小事务 ID

     而MVCC就会通过readview所包含的这四个字段来判断D数据版本对当前事务可见一般分为三种情况:

  • 假设当前的数据版本号小于最小的事务ID,说明该版本的数据在readview前存在,则当前数据对当前事务可见。

  • 假设当前的数据版本号大于最大的事务ID,说明该版本的数据在readview后产生的,则当前数据对当前事务不可见。

  • 假设当前的数据版本号在最小的事务ID与最大的事务ID之间,则通过比对是否在没有提交的事务列表中,如果存在则数据不可见,不存在则数据可见。

3.MVCC的执行流程

     从一个事务开启MVCC之后,针对每一个数据MVCC都会有一个对应的版本处理过程,接下来我们就针对某一个数据,对这样的一个过程进行讲解:

     1.当数据由事务进行提交后,数据更新新的版本,而不被修改,同时增加undolog版本链当中的新的数据版本。

     2.当事务执行SELECT语句以后,就会生成一个对应得数据快照,后通过数据快照,来指定对当前事务可见得数据版本。

插入:

  • 创建一个新版本的数据

  • 设置 trx_id为当前事务 ID

  • 设置 roll_pointer 为 NULL(因为是第一个版本)

删除:

  • 不会真正删除数据,而是将当前版本的trx_id标记为删除该版本的事务 ID

  • 后续事务根据 Read View 判断是否可见

更新:

  • 不会直接修改原数据,而是创建一个新版本

  • 新版本的 trx_id为当前事务 ID

  • 新版本的 roll_pointer指向旧版本

查询:

  • 根据当前事务的 Read View,判断哪些版本是可见的

  • 从最新版本开始,沿着roll_pointer链回溯,找到第一个可见的版本

4.MVCC的优劣势

     MVCC同时也具有其独属的优劣势,接下来我们会对其做逐一的分析:

     MVCC的优势:MVCC是多并发版本控制,通过undoLog日志维护数据的多份版本,并通过readview控制不同事务只能读取指定版本的数据,通过这些工具,我们就能通过MVCC来保证一些并发问题的控制,如脏读,不可重复读,幻读等等。

     MVCC的劣势:MVCC同时也存在许多劣势,如需要保存多个版本的数据,占用更多存储空间,而且其清理机制复杂需要定期清理不再需要的旧版本。

5.总结

    用一句话来说,MVCC就是通过undolog日志来记录同一数据的多个不同的数据版本,再通过数据快照readview来判断哪些事务提交的数据对当前的事务可见,进而避免了脏读,不可重复读,幻读等问题。

今天的分享就到这里了,希望这篇博客能给你一些帮助,让你对关于MVCC的问题得到进一步的提升,在面试的时候能从容面对面试官。


网站公告

今日签到

点亮在社区的每一天
去签到