MVCC机制

358 阅读2分钟

一、概念

MVCC,Multi-Version Concurrency Control,多版本并发控制。并发访问(读或者写)数据库时,对正在事务内处理的数据做多版本的管理,用来避免由于写操作的堵塞,而引发读操作失败的并发问题。

二、必备基础知识

1、锁类型

共享锁 Shared Locks (简称 S 锁,属于行锁)

排他锁 Exclusive Locks(简称 X 锁,属于行锁)

意向共享锁 Intention Shared Locks (简称 IS 锁,属于表锁)

意向排他锁 Intention Exclusive Locks (简称 IX 锁,属于表锁)

自增锁 AUTO-INC Locks

2、共享锁(S)与排它锁 (X)

共享锁

又称之为 读 锁,简称 s 锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,
都能访问到数据库,但是只能读不能修改;

排它锁

又称为写锁,简称 X 锁,排它锁不能与其他锁并存,如一个事务获取了一个数据行的排它锁,其他事务就不能再获取改行的锁(包括共享锁和排它锁),
只有当前获取了排它锁的事务可以对数据进行读取和修改(此时其他事务要读取数据可从快照获取)

3、InnoDB 行锁到底锁的是什么?

InnoDB的行锁是通过给索引上的索引项加锁来实现的,只有通过索引条件进行数据检索,Innodb才使用行级锁。否则,将使用表锁(锁住索引的所有记录)。

借此我们是不是能联想到,如果我们的删除/修改语句是没有命中索引的,哪么,则会锁住整个表,这在性能上的影响还是挺大的。

三、MVCC,以及他的实现原理

1、undo log

undo log 与 redo log 一起构成了 MySQL 事务日志,并且我们上篇文章中提到的日志先行原则 WAL 除了包含 redo log 外,也包括 undo log,事务中的每一次修改,innodb 都会先记录对应的 undo log 记录

那么 undo log 是什么呢?顾名思义,与 redo log 用于数据的灾后重新提交不同,undo log 主要用于数据修改的回滚

正是依赖 undo log,innodb 实现了 ACID 中的 C -- Consistency 即一致性

2、MVCC实现

MVCC 全称是 multiversion concurrency control,即多版本并发控制,是 innodb 实现事务并发与回滚的重要功能

具体的实现是,在数据库的每一行中,添加额外的三个字段:

  • DB_TRX_ID -- 记录插入或更新该行的最后一个事务的事务 ID
  • DB_ROLL_PTR -- 指向改行对应的 undolog 的指针
  • DB_ROW_ID -- 单调递增的行 ID,他就是 AUTO_INCREMENT 的主键 ID

3、快照读与当前读

参考

五分钟搞清楚InnoDB锁机制

一文讲透 MySQL 的 MVCC 机制