温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

MVCC怎样解决并发冲突

发布时间:2026-09-09 19:55:02 来源:亿速云 阅读:97 作者:小樊 栏目:数据库

MVCC(Multi-Version Concurrency Control,多版本并发控制)是一种通过保存数据的多个版本来实现并发控制的机制,常见于 MySQL(InnoDB)、PostgreSQL、Oracle 等数据库。它的核心目标是:在不加锁(或尽量减少锁)的情况下,提高并发性能,同时避免并发冲突。

下面从「并发冲突有哪些」「MVCC 如何解决」两个层面说明。


一、常见的并发冲突

在事务并发时,可能出现:

  1. 脏读:读到未提交的数据
  2. 不可重复读:同一事务内两次读结果不同
  3. 幻读:同一事务内两次查询行数不同
  4. 写写冲突:两个事务同时修改同一行

二、MVCC 的核心思想

读不阻塞写,写不阻塞读

MVCC 通过:

  • 为每个数据行维护多个版本
  • 事务在开始时看到一个一致性快照(Snapshot)
  • 通过版本链 + 可见性规则,决定事务能看到哪个版本

三、MVCC 的关键实现机制(以 MySQL InnoDB 为例)

1. 隐藏字段

每行记录包含:

  • DB_TRX_ID:最后修改该版本的事务 ID
  • DB_ROLL_PTR:回滚指针,指向 Undo Log 中的旧版本

2. Undo Log(版本链)

每次更新:

  • 旧版本写入 Undo Log
  • 新版本更新行数据
  • 通过 roll_ptr 形成版本链

3. ReadView(快照)

事务启动时生成 ReadView,包含:

  • 当前活跃事务 ID 列表
  • 当前最大事务 ID

通过 ReadView 判断:

  • 哪些版本对当前事务可见
  • 哪些版本不可见(未提交 / 在未来)

四、MVCC 如何解决各类并发问题

✅ 1. 避免脏读

  • 未提交事务的版本 对其它事务不可见
  • 读到的一定是已提交版本

✅ 2. 避免不可重复读(RR 级别)

  • 事务内使用同一个 ReadView
  • 多次读取看到的是同一快照版本

✅ 3. 减少幻读(MySQL RR)

  • 快照读(普通 SELECT)不会看到新插入行
  • 当前读(SELECT … FOR UPDATE)配合 Gap Lock 解决

✅ 4. 写写冲突(MVCC 不解决,靠锁)

MVCC 只解决读写冲突,写写冲突靠:

  • 行锁(Record Lock)
  • 事务回滚(乐观冲突检测)

五、一句话总结

MVCC 通过“数据多版本 + 快照读 + 可见性判断”,让读和写互不阻塞,从而解决读写并发冲突;写写冲突仍由锁机制保证。

如果你愿意,我也可以用示意图或结合具体 SQL 事务示例来讲 MVCC。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手