数据多版本是一种能够进一步提高并发的方法,它的核心原理是:

(1)写任务发生时,将数据克隆一份,以版本号区分;

(2)写任务操作新克隆的数据,直至提交;

(3)并发读任务可以继续读取旧版本的数据,不至于阻塞;

mysql innodb 多版本控制的实现_共享锁

 

如上图:

1. 最开始数据的版本是V0;

2. T1时刻发起了一个写任务,这是把数据clone了一份,进行修改,版本变为V1,但任务还未完成;

3. T2时刻并发了一个读任务,依然可以读V0版本的数据;

4. T3时刻又并发了一个读任务,依然不会阻塞;

 

可以看到,数据多版本,通过“读取旧版本数据”能够极大提高任务的并发度。

于是出现了共享锁排他锁

  • 共享锁(Share Locks,记为S锁),读取数据时加S锁
  • 排他锁(eXclusive Locks,记为X锁),修改数据时加X锁

 

共享锁与排他锁的玩法是:

  • 共享锁之间不互斥,简记为:读读可以并行
  • 排他锁与任何锁互斥,简记为:写读,写写不可以并行