MySQL-MVCC 实现乐观锁的一种方式
什么是MVCC
MVCC-多版本的并发控制协议 , MVCC是通过保存数据在某个事件点的快照来实现的
优点是 : 读不加锁 , 读写不冲突
MVCC原理
每开启一个新的事务,事务的ID就会自动递增,也就是为事务分配单向增长的时间戳,为每一个修改保存修改之前的版本(相当于快照),读操作只读该事务开始前的数据库的快照,这样读操作就不用阻塞写操作,写操作不用阻塞读操作的同时,避免了脏读和不可重复读
-
脏读 : 读取未提交数据 , A事务读取B事务未提交的数据,如果此时B事务发生回滚,A事务读取的数据称为脏数据
-
不可重复读 :前后多次读取,数据内容不一致,A事务首先读取一条数据,然后执行逻辑的时候,事务B将这条数据改变了,事务A再次读取的时候发现前后数据不匹配,主要是针对update或delete
-
幻读 :事务A首先根据条件索引得到N条数据,然后事务B改变了这N条数据之外的M条或者增添了M条符合事务A搜索条件的数据,导致事务A再次搜索发现有N+M条数据了,就产生了幻读,主要针对insert
Innodb的最基本行记录(row)中包含一些额外的存储信息:DATA_TRX_ID,DATA_ROLL_PTR,DB_ROW_ID,DELETE BIT
Innodb的MVCC实现方式
1、事务以排他锁的形式修改原始数据
2、把修改之前的数据存放在undo log ,通过回滚指针与主数据关联
3、修改成功万事大吉,修改失败则恢复undo log中的数据
如何移除已经废弃和将不会被读到的数据版本
在Innodb中存在purge线程,它会查询那些比现在最老的活动事务还早的undo log,并删除它们,从而保证undo log文件不至于无限增长。