MySQL中MVCC指什么?
简要回答:
MVCC(multi version concurrency control)即多版本并发控制,为了确保多线程下数据的安全,可以通过undo log和ReadView来实现不同的事务隔离级别。
对于已提交读和可重复读隔离级别的事务来说,MVCC是通过undo log和ReadView来实现的,区别在于创建Read View的时机不同。
已提交读:在每个select语句执行前生成Read View
可重复读:在第一个select语句执行前生成Read View
详细解释:
MVCC(multi version concurrency control)即多版本并发控制,为了确保多线程下数据的安全。
多线程下数据存在安全问题,如:脏读,不可重复读,幻读
脏读:有AB两个事务,B事务对一条数据进行修改,但未提交;而A事务在这之后对同一条数据进行读操作,读到的若是未提交的修改后的数据,就产生了脏读问题。
不可重复读:有AB两个事务,A在多次执行一条查询的SQL语句,在A执行的过程中B修改了某条数据,导致A多次读出来的结果不一样
幻读:有AB两个事务,A在多次执行一条查询的SQL语句,在A执行的过程中B插入了了某条数据,导致A多次读出来的结果不一样
为了避免上述问题,就有了MVCC,用MVCC可以使用undo log和ReadView来实现不同的事务隔离级别
undo log:回滚日志,存储了每行数据的多个版本
ReadView:判断当前事务可以读取哪个版本的依据
事务的隔离级别:
未提交读(RU)
已提交读(RC)
可重复读(RR)
序列化/串行化(Serializable)
隔离级别 | 脏读 | 不可重复读 | 幻读 |
未提交读(RU) | 存在 | 存在 | 存在 |
已提交读(RC) | 不存在 | 存在 | 存在 |
可重复读(RR) | 不存在 | 不存在 | 存在 |
可序列化(Serializable) | 不存在 | 不存在 | 不存在 |
对于已提交读和可重复读隔离级别的事务来说,MVCC是通过undo log和ReadView来实现的,区别在于创建Read View的时机不同。
已提交读:在每个select语句执行前生成Read View
可重复读:在第一个select语句执行前生成Read View
鉴于作者水平有限,文章可能存在错误
如有指正,十分感谢