Java面试题:MVCC

MVCC

保证事务的隔离性

排它锁:

一个事务获取了数据行的排他锁,其他事务就不能再获取该行的其他锁

MVCC:

多版本并发控制

维护一个数据的多个版本,使读写不存在冲突

具体实现依靠

隐藏字段

mysql中隐藏了三个隐藏字段

db_trx_id:最近修改事务

db_roll_ptr:指向上一个版本

db_row_id:隐藏主键

回滚日志:undolog

修改数据库产生的回滚日志,会记录最近修改前的数据

undolog版本链:开启事务后

记录最近修改事务

回滚指针指向上一个版本

readview:读视图

快照读sql执行时MVCC提取数据的依据,记录并维护系统当前活跃的事务的id

当前读

读记录的最新版本,对读记录进行加锁,确保读到最新数据

快照读

读记录的可见版本,可能是历史数据,不加锁,非阻塞

在不同隔离级别中生成快照的时机不同

readview中有四个核心字段

m_ids:当前活跃(没提交的)的事务id集合

min_trx_id:最小的活跃事务id

max_trx_id:预分配的事务id,当前最大事务id+1(下一个分配的事务id)

creator_trx_id:readview创建者的事务id

版本链的访问规则

trx_id:当前的事务id

trx_id == creator_trx_id 可访问

trx_id < min_trx_id 可访问

trx_id >max_trx_id 不可访问

在最小id和最大id之间也可以访问

不同隔离级别下生成ReadView的时机也不同

read committed:在事务每一次执行快照读时生成ReadView

repeated read:仅在事务第一次执行快照读时生成ReadView,后续复用这个ReadView

通过每次生成的读视图,查询不同版本的事务,最终找到一个可访问的最新版本

相关推荐
m0_651593916 分钟前
构建智能SKU系统:编码规则、元数据设计与DDD实战指南
java·大数据·数据库
江沉晚呤时9 分钟前
深入理解 Akka.NET:高并发与分布式系统的利器
开发语言·c#·.net
环黄金线HHJX.10 分钟前
BaClaw龙虾打字
开发语言·人工智能·算法·编辑器
crack_comet15 分钟前
Spring Boot 3.5.11 分离打包(无参数启动+Jar瘦身)完整配置文档
java·spring boot·后端·maven·intellij-idea·jar
echome88815 分钟前
Go 语言并发编程:Channel 与 Goroutine 的完美结合
开发语言·后端·golang
AI科技星18 分钟前
光速螺旋量子几何统一场论:基于四维类时螺旋的物理现象统一推导
开发语言·线性代数·算法·数学建模·平面
weixin_4080996718 分钟前
身份证正反面合并+识别OCR接口调用
java·人工智能·后端·python·ocr·api·身份证ocr
流觞 无依20 分钟前
Linux下SQLite数据库空间管理 查看表占用空间+清理优化
java·jvm·oracle
咬_咬30 分钟前
go语言学习(变量定义与输入输出)
开发语言·学习·golang·io·go语言··go变量定义
Java成神之路-30 分钟前
Spring 注解开发进阶实战:Bean 生命周期、 依赖注入及Properties配置(Spring系列4)
java·后端·spring