MySQL的MVCC
2024-2-14
| 2025-2-25
字数 689阅读时长 2 分钟
type
status
date
slug
summary
tags
category
icon
password
AI summary
Last edited time
Feb 25, 2025 10:00 AM

MVCC

 

readview

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

MySQL的RR事务隔离并没有完全防止幻读

可以使用以下例子重现,该例子来自stackoverflow

📎 参考文章

 
  • MySQL
  • MySQL 备份恢复JVM GC
    Loading...