【mysql中mvcc的含义和作用及原理】

MySQL中的MVCC(多版本并发控制)是一种用于提高数据库并发性能的机制,通过维护数据的多个版本,实现读写操作的无锁并发。以下是其核心要点:


1. MVCC的含义

  • 全称:Multi-Version Concurrency Control(多版本并发控制)
  • 目标:在高并发场景下,避免读写冲突,减少锁竞争,提升性能。
  • 适用引擎 :InnoDB存储引擎支持,主要用于事务的**读已提交(RC)可重复读(RR)**隔离级别。

2. MVCC的作用

  • 无锁并发:读操作(快照读)无需加锁,写操作按需加锁,减少阻塞。
  • 隔离性实现 :通过版本控制,实现不同事务隔离级别的数据可见性规则。
    • 读已提交(RC):每次读操作获取最新已提交的数据。
    • 可重复读(RR):事务首次读操作建立一致性快照,后续读操作基于此快照。
  • 解决部分幻读:RR级别下,通过快照避免大部分幻读,结合间隙锁彻底解决幻读。

3. MVCC的原理

核心机制
  • 隐藏字段
    • DB_TRX_ID:记录最后一次修改该行的事务ID。
    • DB_ROLL_PTR:指向Undo Log中旧版本数据的指针。
    • DB_ROW_ID:隐含的行ID(若无主键时自动生成)。
  • Undo Log:存储数据的历史版本,用于回滚和版本链追溯。
  • Read View:事务执行快照读时生成的一致性视图,决定数据可见性。

Read View的组成
  • trx_ids:生成Read View时活跃(未提交)的事务ID列表。
  • low_limit_id:当前系统最大事务ID+1。
  • up_limit_id:活跃事务中最小的ID。
  • creator_trx_id:创建该Read View的事务ID。

可见性判断规则

对于某行数据的DB_TRX_ID

  1. 如果 DB_TRX_ID < up_limit_id:该版本在Read View创建前已提交,可见
  2. 如果 DB_TRX_ID ≥ low_limit_id:该版本在Read View创建后修改,不可见
  3. 如果 up_limit_id ≤ DB_TRX_ID < low_limit_id
    • DB_TRX_IDtrx_ids中:说明事务未提交,不可见
    • 否则:事务已提交,可见
  4. 对当前事务自身修改的数据,始终可见。

不同隔离级别的行为
  • 读已提交(RC)
    • 每次执行SELECT都会生成新的Read View,读取已提交的最新数据。
  • 可重复读(RR)
    • 事务首次SELECT时生成Read View,后续操作复用该视图,保证一致性快照。

版本链遍历
  • 通过DB_ROLL_PTR指针访问Undo Log中的旧版本,按规则依次判断可见性。
  • 若某个版本对当前事务不可见,则继续回溯更早版本,直到找到可见的版本或到达链头。

4. MVCC的优缺点

  • 优点
    • 读操作无锁,减少阻塞,提高并发性能。
    • 支持非锁定一致性读,适合读多写少场景。
  • 缺点
    • 维护多版本数据增加存储开销(Undo Log)。
    • 频繁的版本清理(Purge机制)可能影响性能。

5. 示例场景

  • 事务A(RR级别)
    1. 开启事务,读取某行数据(生成Read View)。
    2. 事务B修改该行并提交。
    3. 事务A再次读取时,由于Read View未更新,仍看到旧版本数据。
  • 事务A(RC级别)
    1. 开启事务,第一次读取数据。
    2. 事务B修改并提交后,事务A再次读取会生成新Read View,看到新数据。

总结

MVCC通过维护数据多版本和Read View机制,实现了高效的无锁并发读写,平衡了事务隔离与性能。理解其原理对优化事务设计和排查并发问题至关重要。

相关推荐
悲伤小伞31 分钟前
9-MySQL_索引
linux·数据库·c++·mysql·centos
java修仙传1 小时前
数据库和缓存的一致性如何保证?
redis·mysql·mybatis
551只玄猫1 小时前
【数据库原理 实验报告5】数据查询的应用(连接)
数据库·sql·mysql·课程设计·实验报告
aisifang002 小时前
MySQL官网驱动下载(jar包驱动和ODBC驱动)【详细教程】
数据库·mysql
551只玄猫2 小时前
【数据库原理 实验报告2】创建和管理数据表
数据库·sql·mysql·课程设计·实验报告
wuyikeer3 小时前
windows同时安装两个不同版本的Mysql
windows·mysql·adb
xcLeigh4 小时前
告别 Excel 繁琐操作!Metabase让数据可视化触手可及
mysql·docker·信息可视化·excel·数据可视化·metabase·cpolar
编程饭碗4 小时前
【Mysql日期字段】
数据库·mysql
Thomas.Sir4 小时前
精通 MySQL 面试题
数据结构·数据库·mysql
鸽芷咕4 小时前
从语法兼容到语义一致:深度解析金仓如何“无感”承接MySQL复杂业务
数据库·mysql