一、什么是MVCC?
MVCC(Multi-Version Concurrency Control)是一种数据库并发控制机制,用于处理多个事务同时访问数据库时可能出现的并发冲突问题。
通过名称关键字: 多版本
, 并发控制
去理解。
多版本:单版本就是一个数据,在变更(新增,修改,删除)都是最新状态,没有历史记录,而最新状态下,要维护数据并发下的安全性,则要通过并发处理(通常加锁)保证,而多版本就是数据存在多个版本,多个事务在读取修改时,存在多个版本,可能读取旧的版本,也可能读取最新版本(具体情况根据隔离级别等判断)。
并发控制:如果不是并发情况下,就不需要控制了,要先知道并发所带来的问题后再去对比方案的不同。
二、MVCC解决了什么问题?
1.首先分析场景(都是以行数据为例,MVCC在行数据上极大提高了并发性
):
数据库并发有 读-读 , 读-写(写-读),写-写 等场景
常见解决方案就是,读写锁,这样能满足读读共享,读写互斥,写写互斥。
初步看是没有问题的,但实际存在一个极大的问题,大多数互联网公司都是读多写少
假设例子:某商城APP首页公告,每天首页打开上千万次或者上亿次,如果修改商城公告时,所有的读操作受阻,是不是所有人都会存在一个读延时的情况,体验极差,解决体验的方式通常是能读取最新的就给最新的,不能读取最新的时候,就给旧数据,最大的需求就是不要用户阻塞。
(这里例子纯从理解读写锁性能场景角度出发,非实际并发应用案例,无隔离,缓存,读写分离等等不需考虑
)
MVCC就是极大的解决了这个问题(读写并发),通过不加锁的情况下,去满足一些常见的读写并发行为,为事务提高并发性,此时的读操作称之为快照读,可能读取的非最新数据。
至于写写操作,如果不担心写丢失问题可以不用管,否则还是需要通过加锁解决。
2.从隔离级别来说
Mysql存在四种隔离级别,读未提交,读提交,可重复读,序列化四个隔离级别
-
读未提交 这种就是无并发控制,直接读最新数据就可以
-
读提交 存在并发控制和读写情况,则可以通过MVCC解决
-
可重复读 存在并发控制和读写情况,则可以通过MVCC解决
-
串行化 已经将事务串行执行,并发已经被解决彻底了
也就是MVCC解决了读提交和可重复读的隔离性问题。