MVCC

读-读不会发生并发冲突,写-写发生冲突的概率比较小,加锁就可以解决。

多版本并发控制(MVCC)可以解决读-写并发冲突,提高并发性能。

简单来说,MVCC 就是存储了同一条数据的不同历史版本链,不同事物可以访问不同的数据版本。

InnoDB 中在主键的聚集索引上加入了两个重要的隐藏字段:

  • DB_TRX_ID,创建或者修改数据的事务ID;

  • DB_ROLL_PTR,回滚指针,指向记录的上一个版本。

多版本数据链使用UNDO日志实现。

当前读和快照读

当前读就是读取记录的当前(最新)版本,其他事务不能修改记录。

- SELECT ... LOCK IN SHARE MODE
- SELECT ... FOR UPDATE
- INSERT
- UPDATE
- DELETE

快照读(SELECT)是指读取 MVCC 版本链中的某个快照版本,不需要加锁。

Read View

Read View 是事务进行快照读生产的读视图,记录并维护系统当前活跃的事务id。

  • rw_trx_ids: 生成 Read View 时,当前活跃的事务 id 数组。
  • min_trx_id: rw_trx_ids 中最小的事务 id 。
  • max_trx_id: 生成 Read View 时,将要分配给下一个事务的 id。
  • curr_trx_id: 创建 Read View 的当前事务 id。