MVCC原理解析

前置知识:
幻读:同一个事务中两次相同条件的读,因为其他事务的插入数据造成两次读取数据不一样
不可重复度:同一个事务中两次相同条件的读,因为其他事务的修改或删除数据造成两次读取数据不一样
一.解决了什么问题?
1.解决并发读取数据的数据一致性。解决了幻读和不可重复度。体现在mysql 设置为RR。
二原理:
1.数据库中没一行数据都有两个隐藏的列:trx_id(事务版本号id)和roll_ptr(删除版本号id),事务版本号id是递增的。MVCC就是通过设置事务版本号id和删除版本号id来实现同一事务读的一致性。
add操作:插入一行数据,trx_id设置为当前事务版本号,roll_ptr设置为null
select操作:只能读取<=当前事务版本号的且删除版本号为null或>当前版本号的其他事务已提交的数据。也就是说当前读取只能读取之前事务提交的且是之前事务没删除的数据。
delect操作:将roll_ptr的值设置为该事务的版本号
update操作:其实分两步:先删除原有数据,再新增一条数据即执行上边的delect和add操作。

实操模拟:
事务1先插入一条数据commit;
然后事务1 begin开启事务:读取数据 select * 为
在这里插入图片描述
此时事务二添加一条数据 2 李四 commit;
此时事务二读取数据select * 为
在这里插入图片描述
此时事务一(还为提交)读取数据select * 还是 1 张三,因为在事务一只能读取trx_id<=1且roll_ptr 为null或>1的,只有1 张三;
开启事务三,begin 删除2李四 ,
此时事务三读取结果为
在这里插入图片描述

然后提交。
此时事务三再次读取数据为 1 张三。
此时由于事务一(仍未提交),事务一读取只能读取只有1 张三;
此时事务四begin 修改1张三 为1 张三a则数据变为(将第一行的roll_ptr改为4删除,然后新增一条trx_id为4的 1 张三a)
在这里插入图片描述
此时事务四根据select 规则只能读取到 1 张三a 。 commit;
此时由于事务一(仍未提交),事务一读取只能读取只有1 张三;

至此。MVCC解决了事务的幻读(事务插入造成的前后读不一致)和不可重复读(修改或删除)。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值