MVCC
1. 什么是MVCC?
多版本并发控制技术的英文全称是 Multiversion Concurrency Control,简称 MVCC 。
是通过保存数据在某个时间点的快照来实现并发控制的。也就是说,不管事务执行多长时间,事务内部看到的数据是不受其它事务影响的,根据事务开始的时间不同,每个事务对同一张表,同一时刻看到的数据可能是不一样的。
可以认为MVCC是行级锁的一个变种,但是它在很多情况下避免了加锁操作,因此开销更低。MVCC将数据库的行锁与行的多个版本结合起来,只需要很小的开销就可以实现读写不加锁,从而大大提高数据库系统的并发性能。
注意
写写情况还是需要加锁阻塞的。
MVCC并没有解决幻读问题。
2. MVCC解决什么问题?
- 通过 MVCC 可以让读写互相不阻塞,即读不阻塞写,写不阻塞读,这样就可以提升事务并发处理能力。
- 因为 InnoDB 的 MVCC 采用了乐观锁的方式,读取数据时并不需要加锁,对于写操作,也只锁定必要的行。
- 一致性读也被称为快照读,当我们查询数据库在某个时间点的快照时,只能看到这个时间点之前事务提交更新的结果,而不能看到这个时间点之后事务提交的更新结果。
3. MVCC如何工作?
MVCC保存某个时间点上的数据快照。一个事务内,看到的是同一个版本的快照,数据一致。不同事务在同一时间点看到的数据会不一致,因为他们得到的数据版本不一样。不同存储引擎的MVCC实现是不同的,典型的有乐观(optimistic)并发控制和悲观(pessimistic)并发控制。
隐藏字段
在InnoDB中,每个数据行记录除了一般数据列还包含下面几个隐藏字段:
-
DB_ROW_ID
:6-byte,隐藏的行 ID,用来生成默认聚簇索引。如果我们创建数据表的时候没有指定聚簇索引,这时 InnoDB 就会用这个隐藏 ID 来创建聚集索引。 -
DB_TRX_ID
:6-byte,操作这个数据的事务 ID,也就是最后一个对该数据进行插入或更新的事务 ID。这也是下面所说的修改版本号和删除版本号。注意有1 bit用来标志是否被删除。
-
DB_ROLL_PTR
:7-byte,回滚指针,也就是指向这个记