mysql数据库中的mvcc
一、什么是MVCC?
Multiversion concurrency control (多版本并发控制)
并发访问(读或写)数据库时,对正在事务内处理的数据做多版本的管理.以用来避免写操作的堵塞,从而引发读操作的并发问题
二、 MVCC中的插入流程
数据行当中有隐藏的2列
DB_TRX_ID:数据行的版本号,即事务的id值
DB_ROLL_PT:删除版本号
当插入数据时,DX_TRX_ID = 事务的id,DB_ROLL_PT = null
三、 MVCC中的删除流程
当删除数据时,DX_TRX_ID不变,DB_ROLL_PT = 事务的id
四、 MVCC中的修改流程
当修改数据时,首先将修改命中的数据进行复制,复制数据的DB_TRX_ID=当前事务的id,DB_ROLL_PT=null,将之前的数据的DB_ROLL_OT==当前事务的id
四、 MVCC中的查询流程
查询数据的规则:
- 查询数据行版本早于当前事务版本对数据行,也是就行的系统版本号小于或等于事务的系统版本号,这样可以确保事务读取的行,要么是在事务开始前已经存在,要么是事务自身插入或者修改过的
- 查询删除版本号要么为null,要么大于当前事务的版本号的记录,确保取出来的行记录在事务开启之前没有被删除.
五、案例讲解
案例一
案例二
案例中,根据理论,读出来的数据应该是这样的,实际上,修改是加上了x锁,我们是无法读取到数据,我们是读的快照中的数据
六、Undo log
Undo log 是什么?
undo意为取消,以撤销操作为目的,返回制定某个状态的操作
undo log指事务开始之前,在操作任何数据之前,首先将需要操作的数据备份到一个地方(undo log)
UndoLog 是为了实现事务的原子性而出现的产物
事务处理过程中如果出现了错误或者用户执行了ROLLEBACK语句,Mysql可利用Undo log中备份,将数据恢复到事务开始之前的状态
UndoLog在mysql innodb存储引擎中用来实现多版本并发控制
事务位提交之前,Undo保存了未提及之前的版本数据,Undo 中的数据可作为数据旧版本供其他并发事务进行快照读
Undo log 图解
七、Redo log
Redo log 是什么?
Redo,顾名思义就是重做.以恢复操作为目的,重现操作.
Redo log 指事务中操作的任务数据,将最新的数据备份到一个地方(Redo Log)
Redo log的持久
不是随着事务的提交才写入的,而是在事务的执行中,便开始写入redo中.具体的落盘策略可以进行配置
RedoLog是为了实现事务的持久性而出现的产物
防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redo log进行重做,从而达到事务的未入磁盘数据进行持久化这一特性.
Redo log图解
Redo log 补充知识点
redo log Os cache 是电脑操作系统的缓存