type
status
date
slug
summary
tags
category
icon
password
AI summary
Last edited time
Feb 25, 2025 10:00 AM
MVCC
readview

RC、RR隔离级别在事务开始时会生成一个 readview, 包含以下要素信息creator_trx_id
生成该 readview 的事务的事务idtrx_ids
在生成 readview 时当前系统中活跃的读写事务的事务id列表(开启事务但未提交)up_limit_id
生成 readview 时 活跃trx_ids 中的最小值low_limit_id
生成 readview 时 系统中应该分配给下一个事务的id值有了这个readview,这样在访问某条记录时,只需要按照下面的步骤判断记录的某个版本是否可见
- record_trx_id = creator_trx_id 表明当前事务在访问它自己修改过的记录,所以该版本可以被当前事务访问
- record_trx_id < up_limit_id 表明生成该版本的事务在当前事务生成 readview 前已经提交,所以该版本可以被当前事务访问
- record_trx_id >= low_limit_id 表明生成该版本的事务在当前事务生成 readview 后才开启,所以该版本不可以被当前事务访问
- record_trx_id between min_trx_id and max_trx_id && record_trx_id not in trx_ids 说明创建ReadView时生成该版本的事务已经被提交,该版本可以被访问
- record_trx_id between min_trx_id and max_trx_id && record_trx_id in trx_ids 说明创建ReadView时生成该版本的事务还是活跃的,该版本不可以被访问
mysql 源码中 readview 结构的说明
MySQL的RR事务隔离并没有完全防止幻读
可以使用以下例子重现,该例子来自stackoverflow