定义
MVCC:
Multiversion concurrency control (多版本并发控制)
白话解释: 并发访问(读或写)数据库时,对正在事务内处理的数据做多版本的管理,以达到用来避免写操作的堵塞,从而引发读操作的并发问题。
MVCC的逻辑流程
在我们的每一个表中的,会默认生成三列隐藏的数据,其中跟MVCC相关的只有两列,如下:
1.数据行的版本号(DA_TRX_ID)也就是该记录入库的版本号
- 删除的版本号(DB_ROLL_PT)
插入数据时
如下图,插入数据时,此时事务未提交,此时会把该操作事务的ID作为数据行的版本号。
删除数据时
修改数据时
其实是相当如把修改的数据复制一份,此时事务id作为删除版本号,然后插入新的记录,数据行的版本号为删除的版本号,再把原来的数据删除。
查询的逻辑流程
然后我们来看下以下的案例:
数据准备:
前提,先执行插入两条数据,并且提交。
insert into teacher(name,age) value ('seven',18) ;
insert into teacher(name,age) value ('qing',20) ;
tx1:
begin; ----------1
select * from users ; ----------2
commit;
tx2:
begin; ----------3
update teacher set age =28 where id =1; ----------4
commit;
案例1
执行顺序为: 1,2,3,4,2
先执行读,不提交,再执行3,4更新,此时再执行2,读。这时候读出来的数据是未提交前的,符合逻辑。
这时存在脏读。
案例2
执行顺序为: 3,4,1,2
先执行3,4,更新字段,不提交。然后再执行读,此时,读出来的数据为未提交且更新后的数据。
等更新提交后,独读出的数据就不一致了,此情况存在不可重复度。
所以我们可以知道,他解决脏读,不可重复读不是通过MVCC来解决的。