MVCC
MVCC (Multiversion Concurrency Control),多版本并发控制,是Innodb实现事务回滚与并发的重要功能
目的:解决不可重复读,用于支持读已提交(RC)和可重复读(RR)隔离级别的实现
数据库的几种并发场景
场景 | 是否存在问题 |
---|---|
读读 | 不存在数据安全问题 |
写写 | 有数据安全问题,更新丢失 |
读写 | 有线程安全问题,脏读、幻读、不可重复读(MVCC就是为了解决这种问题而存在的) |
如果是RC隔离级别,那么每次在进行快照读的时候都会生成一个新的readview
如果是RR隔离级别,那么只有在当前事务第一次进行快照读的时候会生成readview,之后的快照读都会沿用当前的readview
RC和RR之间的区别就在于生成readview的时机不同
MVCC主要是用来解决【读-写】冲突的无锁并发控制,可以解决以下问题:
- 在并发读写数据时,可以做到在读操作时不用阻塞写操作,写操作不用阻塞读操作,提高数据库并发读写的性能。
- 可以解决脏读,幻读,不可重复读等事务隔离问题,但不能解决【写-写】引起的更新丢失问题。
MVCC与锁的组合
一般数据库中都会采用以上MVCC与锁的两种组合来解决并发场景的问题,以此最大限度的提高数据库性能。
- MVCC + 悲观锁MVCC解决读-写冲突,悲观锁解决写-写冲突。
- MVCC + 乐观锁MVCC解决读-写冲突,乐观锁解决写-写冲突。
通过上述描述,MVCC的作用可以概括为就是为了解决【读写冲突】,提高数据库性能的,而MVCC的实现又依赖【隐式字段】【undo日志】【版本链】【快照读和当前读】【读视图】。