什么是MVCC?
全称为Multi-Version Concurrency Control:多版本并发控制
有什么用?
- mysql的早期版本中 读写并发,写读并发,写并发会被阻塞执行,在引入mvcc后,可以大大降低阻塞的概率,只有在写并发到时候会被阻塞。
- 一般根据情况,通过mvcc解决读写冲突,悲观锁/乐观锁解决多写并发问题
- 读写并发:线程安全问题,可能存在事物隔离问题[ 脏读,幻读,不可重复读]
- 多写并发:线程安全问题,存在数据更新丢失问题
- 多读并发:不存在问题
是通过innodb行锁实现的么
innoDB的行锁是 innodb_row_lock,mvcc是使用了row_level_lock实现
实现原理
《高性能MySQL》中对MVCC的描述
数据库中每行记录都有两个隐藏列,记录事物创建版本号,和这行数据合适过期
- DB_ROW_ID:是数据库默认为该行记录生成的唯一隐式主键
- DB_TRX_ID: 是当前操作该记录的事务ID
- DB_ROLL_PTR: 是回滚的指针,执行上一个版本
每次数据变更,事物id都会自增,再查询时,只要查找版本<=当前事物版本的数据就好,这样读取到的数据可以保证即便不是当前事物提交的,也是之前存在的数据。