java面试题超详细整理《MySQL》三

本文深入解析了多版本并发控制(MVCC)的概念及其在MySQL中的实现原理,包括如何通过版本链实现读写并发,以及不同隔离级别下Readview的生成策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是MVCC
多版本并发控制:读取数据时通过一种类似快照的方式将数据保存下来,这样读锁就和写锁不冲突了,不同的事务session会看到自己特定版本的数据,版本链

MVCC只在 READ COMMITTED(读已提交)和 REPEATABLE READ(可重复读)两个隔离级别下工作。其他两个隔离级别够和MVCC不兼容,因为 READ UNCOMMITTED(读未提交)总是读取最新的数据行,而不是符合当前事务版本的数据行。而 SERIALIZABLE(串行化)则会对所有读取的行都加锁。

聚簇索引记录中有两个必要的隐藏列:
trx_id:用来存储每次对某条聚簇索引记录进行修改的时候的事务id
roll_pointer:每次对哪条聚簇索引记录有修改的时候,都会把老版本写入undo日志中。这个ro‖_pointer就是存了一个指针,它指向这条聚簇索引记录的上一个版本的位置,通过它来获得上一个版本的记录信息。(注意插入操作的undo日志没有这个属性,因为它没有老版本)

Mysql的MVCC通过版本链,实现多版本,可并发读写,写读。通过 Readview生成策略的不同实现不同的隔离级别:

始事务时创建 readview, readview维护当前活动的事务id,即未提交的事务id,排序生成一个数组。
访问数据获取数据中的事务id(获取的是事务id最大的记录),对比 readview如果在 readview的左边(比 readview都小),可以访问(在左边意味着该事务已经提交)
如果在 readview的右边(比 readview都大)或者就在 readview中,不可以访问,获取 roll_ pointer,取上一版本重新对比(在右边意味着,该事务在 readview生成之后出现,在 readview中意味着该事务还未提交)
已提交读和可重复读的区别就在于它们生成 Readview的策略不同:
已提交读隔离级别下的事务在每次查询的开始都会生成一个独立的 Readview,而可重复读隔离级别则在第一次读的候生成一个 Readview,之后的读都复用之前的 Readview
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值