MVCC简单理解
MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。
这是百度百科给的标准的回答
转化成自己的语言:
多版本的意思就是数据库中同时存在多个版本的数据,并不是整个数据库的多个版本,而是某一条记录的多个版本同时存在,在某个事务对其进行操作的时候,需要查看这一条记录的隐藏列事务版本id,比对事务id并根据事物隔离级别去判断读取哪个版本的数据。
这几个名词要记住,能通过博客把他们都搞懂就okok啦
- 事务隔离级别
- 一条完整的数据记录
- undo日志
- ReadView
MVCC的好处\作用
- MVCC在MySQL InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读
- 我们都知道并发访问数据库造成的四种问题(脏写(修改丢失)、脏读、不可重复读、幻读),MVCC就是在尽量减少锁使用的情况下高效避免这些问题
数据库的四种隔离级别
隔离界别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
READ UNCOMMITTED:未提交读 | 可能发生 | 可能发生 | 可能发生 |
READ COMMITTED:已提交读 | 解决 | 可能发生 | 可能发生 |
REPEATABLE READ:可重复读 | 解决 | 解决 | 可能发生 |
SERIALIZABLE:可串行化 | 解决 | 解决 | 解决 |
为什么没有脏写?
四种问题按照严重性排序:脏写 > 脏读 > 不可重复读 > 幻读
脏写这个问题太严重了,不论是哪种隔离级别,都不允许脏写的情况发生。
好!那下面就开始进入正题……
MVCC的实现原理
一、依赖于隐藏的两个列
我在之前的博客中提到过在InnoDB下的Compact行结构,有三个隐藏的列
列名 | 是否必须 | 描述 |
---|---|---|
row_id | 否 | 行ID,唯一标识一条记录(如果定义主键,它就没有啦) |
transaction_id | 是 | 事务ID |
roll_pointer | 是 | DB_ROLL_PTR是一个回滚指针,用于配合undo日志,指向上一个旧版本 |