MVCC简记

MVCC属于数据库事务中的技术,通过MVCC可以在无锁情况(死锁会减少)下实现mysql的可重复读与读已提交两种事务隔离级别。请先阅读事务博客

MVCC:多版本并发控制,控制事务能看到哪些版本的数据,哪些看不到。MVCC采用undolog链存储历史数据,每条记录有两个隐藏列id和undolog指针字段,每次查询生成readview,readview记录相对于该事务未提交的数据,通过readview与undolog比较,可以判断哪些数据是当前事务可见的。

  • 隐藏字段:聚簇索引行记录有trx_id,roll_pointer。
  • undo log 版本链:对未提交事务的数据并发修改会把历史记录存到undo log版本链,通过指针可以查到历史数据。事务提交后该undo log 会被回收。
  • Read View:使用四个字段记录当前事务的事务状态,判断哪些字段是否可以读取?哪些字段对于当前事务不可见?可以读取的字段的哪些历史版本可以读取?实现不同事务的隔离(只在下面两个级别工作)四个字段分别是:活跃事务aid,活跃事务中最小mid,下一事务nextid。undolog的id小于mid可见。大于nextid不可见。mid和nextid之间若在aid中不可见,否则可见
    • 可重复读隔离级别:开启事务后,执行第一条select语句,会创建read view,后面会 复用这个read view
    • 读已提交隔离级别:开启事务后,每执行一次select都会重新创建read view
    • 自己的更新记录是可见的
      • 如果记录的trx_id < read view 的min_trx_id,认为该记录已经被提交,事务可见。
      • 相反>= max_trx_id则未提交则不可见。
      • 如果max_trx_id > trx > min_trx_id,且在m_ids列表中则认为未提交不可见,不在m_ids列表中则可见
    • 可重复读没完全解决不可重复读 。快照读 (普通 select 语句),是通过 MVCC 方式解决了幻读。当前读 (select ... for update 等语句),是通过 next-key lock(记录锁+间隙锁)方式解决了幻读。快照读后再当前读会发生幻读,尽量在开启事务之后,马上执行 select ... for update 这类当前读的语句
相关推荐
生产队队长1 分钟前
Redis:Windows环境安装Redis,并将 Redis 进程注册为服务
数据库·redis·缓存
老邓计算机毕设2 分钟前
SSM找学互助系统52568(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·javaweb 毕业设计
痴儿哈哈5 分钟前
自动化机器学习(AutoML)库TPOT使用指南
jvm·数据库·python
洛豳枭薰28 分钟前
Innodb一次更新动作
mysql
Σίσυφος190036 分钟前
PCL法向量估计 之 方向约束法向量(Orientation Guided Normal)
数据库
老毛肚39 分钟前
手写mybatis
java·数据库·mybatis
海山数据库44 分钟前
移动云大云海山数据库(He3DB)postgresql_anonymizer插件原理介绍与安装
数据库·he3db·大云海山数据库·移动云数据库
云飞云共享云桌面1 小时前
高性能图形工作站的资源如何共享给10个SolidWorks研发设计用
linux·运维·服务器·前端·网络·数据库·人工智能
2501_927993531 小时前
SQL Server 2022安装详细教程(图文详解,非常详细)
数据库·sqlserver
星火s漫天1 小时前
第一篇: 使用Docker部署flask项目(Flask + DB 容器化)
数据库·docker·flask