mysql之MVCC的原理

定义

MVCC:
Multiversion concurrency control (多版本并发控制)

白话解释: 并发访问(读或写)数据库时,对正在事务内处理的数据做多版本的管理,以达到用来避免写操作的堵塞,从而引发读操作的并发问题。

MVCC的逻辑流程

在我们的每一个表中的,会默认生成三列隐藏的数据,其中跟MVCC相关的只有两列,如下:

1.数据行的版本号(DA_TRX_ID)也就是该记录入库的版本号

  1. 删除的版本号(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来解决的。

你可能感兴趣的:(mysql之MVCC的原理)