浅谈RR、RC事物隔离级别下MVCC的应用

本文讨论了MVCC(多版本并发控制)在提高读取性能和并发性的同时,如何通过undolog和readview处理不同隔离级别(如RC和RR)下的不可重复读和幻读问题。MVCC在RC隔离级别下无法完全解决这些问题,需要额外的锁定机制。

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

背景介绍

mvcc:事物多版本并发控制,为了读取数据时不加锁提高读取性能和并发性的一种手段。在快照读的基础上,通过undo log版本链和read view实现的。

RR:读已提交隔离级别,只允许当前事物只能读取到其他事物已经提交的数据。不会产生脏读,但会有不可重复读或幻读的问题。

RC:可重复读隔离级别,在同一个事物内,多次读取同一行数据,结果一致。不会产生脏读、不可重复读,但是会有幻读的问题。

应用实践

        mvcc是通过undo log版本链和read view实现的。同时,每一个行数据有隐藏的三个字段,当前行的事物ID、回滚指针、行ID(用于无主键或唯一键时,生成聚簇索引)。

        read view: 包含三个字段

        m_ids: 当前活跃的事物,即已开启未提交的事物

        min_m_id:活跃事物中的最小事物id

        max_m_id:活跃事物中最大事物id + 1

RC

        RC隔离级别,每一次select快照读都会生成新的read view,所以mvcc无法解决不可重复读和幻读的问题。

idorder_idnameamounttrx_idroll_pointer
12001张三10000null

        

RR

         RR隔离级别,每一次select快照读都会依赖第一次所生成的read view,但是如果中间存在当前读且当前读覆盖了之前的事物,就会出现不可重复读或幻读,所以mvcc只能部分解决不可重复读和幻读的问题。

idorder_idnameamounttrx_idroll_pointer
12001张三10000null

结论

        MVCC不能解决RC隔离级别下的不可重复读和幻读,可以部分解决RR隔离级别下不可重复读和幻读。

        如果要完全解决不可重复读和幻读,可以加行锁和临间锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值