| MVCC (Multiversion Concurrency Control),多版本并发控制。顾名思义,MVCC 是通过数据行的多个版本管理来实现数据库的 并发控制 。 |
| 这项技术使得在InnoDB的事务隔离级别下执行 一致性读 操作有了保证。换言之,就是为了查询一些正在被另一个事务更新的行,并且可以看到它们 |
| 被更新之前的值,这样在做查询的时候就不用等待另一个事务释放锁 |
| MVCC在MySQL InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理 读-写冲突 ,做到即使有读写冲突时,也能做到 不加锁 , |
| 非阻塞并发读 ,而这个读指的就是 快照读 , 而非 当前读 。当前读实际上是一种加锁的操作,是悲观锁的实现。而MVCC本质是采用乐观锁思想 |
| 的一种方式 |
| |
| # 快照读 |
| 快照读又叫一致性读,读取的是快照数据。不加锁的简单的 SELECT 都属于快照读,即不加锁的非阻塞读,如下: |
| SELECT * FROM player WHERE ... |
| 之所以出现快照读的情况,是基于提高并发性能的考虑,快照读的实现是基于MVCC,它在很多情况下,避免了加锁操作,降低了开销。 |
| 既然是基于多版本,那么快照读可能读到的并不一定是数据的最新版本,而有可能是之前的历史版本。 |
| 快照读的前提是隔离级别不是串行级别,串行级别下的快照读会退化成当前读 |
| |
| # 当前读 |
| 当前读读取的是记录的最新版本(最新数据,而不是历史版本的数据),读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。 |
| 加锁的 SELECT,或者对数据进行增删改都会进行当前读,如下: |
| SELECT * FROM student LOCK IN SHARE MODE; # 共享锁 |
| SELECT * FROM student FOR UPDATE; # 排他锁 |
| INSERT INTO student values ... # 排他锁 |
| DELETE FROM student WHERE ... # 排他锁 |
| UPDATE student SET ... # 排他锁 |
| 对于使用 InnoDB 存储引擎的表来说,它的聚簇索引记录中都包含两个必要的隐藏列。 |
| trx_id :每次一个事务对某条聚簇索引记录进行改动时,都会把该事务的 事务id 赋值给trx_id 隐藏列。 |
| roll_pointer :每次对某条聚簇索引记录进行改动时,都会把旧的版本写入到 undo日志 中,然后这个隐藏列就相当于一个指针, |
| 可以通过它来找到该记录修改前的信息 |

| insert undo只在事务回滚时起作用,当事务提交后,该类型的undo日志就没用了,它占用的UndoLog Segment也会被系统回收 |
| (也就是该undo日志占用的Undo页面链表要么被重用,要么被释放) |
| # 开启1个事务 |
| begin; |
| # 执行业务 |
| UPDATE student SET name="李四" WHERE id=1; |
| UPDATE student SET name="王五" WHERE id=1; |
| # 提交事务 |
| COMMIT; |
| |
| # 开启第2个新的事务 |
| begin; |
| # 执行业务 |
| UPDATE student SET name="钱七" WHERE id=1; |
| UPDATE student SET name="宋八" WHERE id=1; |
| # 提交事务 |
| COMMIT; |
| |
| # 每次对记录进行改动,都会记录一条undo日志,每条undo日志也都有一个 roll_pointer 属性( INSERT 操作对应的undo日志没有该属性, |
| 因为该记录并没有更早的版本),可以将这些 undo日志都连起来,串成一个链表 |
| |
| 对该记录每次更新后,都会将旧值放到一条 undo日志 中,就算是该记录的一个旧版本,随着更新次数的增多,所有的版本都会被 roll_pointer |
| 属性连接成一个链表,我们把这个链表称之为 版本链 ,版本链的头节点就是当前记录最新的值 |
| |
| 每个版本中还包含生成该版本时对应的 事务id |

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY