首页 > 数据库 >一文了解MVCC——解锁数据库并发控制的“魔法钥匙”

一文了解MVCC——解锁数据库并发控制的“魔法钥匙”

时间:2024-12-31 09:26:58浏览次数:8  
标签:事务 解锁 魔法 trx MVCC 版本 ReadView 数据 id

MVCC概念

MVCC全称叫做Multiversion Concurrency Control,多版本并发控制。MVCC的出现主要是为了提升数据库并发性能,用较好的方式处理事务并发的读写冲突,避免了加锁操作,降低性能开销,在有读写冲突时,能够做到非阻塞并发读。

  • MVCC可以通过乐观锁的方式,在可重复读隔离级别下来解决不可重复读和幻读的问题。

MVCC原理

在MVCC机制中,多个事务对同一条记录做修改,会产生多个历史快照,这些历史快照保存在undo log里,当一个事务对该记录进行查询时,MVCC会通过ReadView解决行的可见性问题。

ReadView是事务在使用MVCC机制进行快照读时产生的读视图。

ReadView

ReadView字段说明:

字段字段说明
creator_trx_id创建这个 Read View 的事务 ID
trx_ids生成ReadView时当前系统中活跃的 事务id列表
up_limit_id活跃的事务中最小的事务 ID
low_limit_id系统最大的事务ID值(注意,不是活跃事务中的最大值)

undolog回滚链

  • mysql数据库中,最新的记录永远是行记录。行记录中的回滚指针指向的是上一个修改该数据的事务对应的undo log,当判断一个事务要读取哪个版本时,需要根据最新的行记录按回滚链结合undolog进行回滚,来得到历史快照,而不是直接存放了多个行记录。 如果每一个事务启动时都创建一个整张表的快照,那显然不现实,假如一个表50G,创建个50G的快照肯定就超级慢了。

假如这里有一张book表,表里有三个字段主键idbook_nameuserbook_name为书名,user为当前借阅该书人的姓名。表里初始数据如下:

idbook_nameuser
1《活着》小赵
有两条事务分别对这条数据进行如下操作:
事务5事务10
BEGIN;
BEGIN;
update book set user = '小钱' where id = 1
update book set user = '小孙' where id = 1
COMMIT;
update book set user = '小李' where id = 1
update book set user = '小周' where id = 1
COMMIT;
则上述两个事务操作会形成如下表所示的版本链:
版本标识idbook_nameusertrx_idroll_pointer
V51《活着》小周10V4
V41《活着》小李10V3
V31《活着》小孙5V2
V21《活着》小钱5V1
V11《活着》小赵1

ReadView 规则

当有事务X 查询id = 1这条数据时,会按照什么规则进行判断读到的值呢?这里假设要查询的事务为X,数据版本对应的事务为D, 当进行查询时,活跃的事务有事务5事务10,**即X事务此时对应的ReadViewtrx_ids值为[5,10],则在判断可见性时会按照如下规则进行判断:

  • 数据版本的的trx_idReadView中的creator_trx_id和一致,说明ReadView由当前事务X创建,所以该数据版本可以被事务X查看。
  • 数据版本的trx_id小于ReadViewup_limit_id,则说明该数据版本对应的事务已经提交,事务X能够看到该数据版本。
  • 数据版本的trx_id大于等于ReadViewlow_limit_id,说明该数据版本对应事务的提交在事务X之前,则该数据版本对事务X不可见。
  • 数据版本的trx_idReadViewup_limit_idlow_limit_id之间,则有如下两种情况:
    • 数据版本对应的trx_idReadViewtrx_ids中,说明该数据版本对应的事务事务X创建ReadView时未提交,则该数据版本对于事务X不可见。
    • 数据版本对应的trx_id不在ReadViewtrx_ids中,说明该数据版本对应的事务已经提交,所以,该数据版本对事务X可见。

上述规则在阅读起来稍微有些难以理解,下面以一个表格来辅助记忆:

< up_limit_idtrx_ids:[5,10]>=low_limit_id
区间1区间2区间3
已提交事务集合未提交事务集合未开始事务集合
一个数据版本对应的trx_id有以下几种可能,这里将数据版本对应的事务称作事务V :
  • 落在区间1,表示已提交,则该数据对事务X可见
  • 落在区间3,表示事务V事务X创建时还未开始,则该数据对事务X不可见。
  • 落在区间2
    • 如果trx_id不在trx_ids列表里,表示事务V已提交,则该数据对事务X可见。
    • 如果trx_idtrx_ids集合里,表示事务V事务X创建时还未完成提交,则该数据对事务X不可见。

快照读与当前读

  • 快照读,又称为一致性读,读的是快照数据。简单的select * from t where ……读的就是快照。
  • 当前读,指读取的是最新版本,并且在读取时会对读到的记录进行加锁。加锁的 SELECT,或者对数据进行增删改(更新数据都是先读后写的)都会进行当前读。

MVCC与隔离级别

READ UNCOMMITED隔离级别下,允许一个事务可以读取到其他事务未提交的数据,因此,此种隔离级别下无需做任何特殊处理。

SERIALIZABLE隔离级别下,由于事务只能串型读取,只能采取加锁的方式实现。

READ COMMITTEDREPEATABLE READ隔离级别下,要保证读到的是已提交的数据。那么,这个时候就需要用到MVCC了。总结就是:MVCC会用于READ COMMITTEDREPEATABLE READ隔离级别的实现。

要保证REPEATABLE READ隔离级别的实现,只需要在第一次Select的时候获取一次ReadView,后面所有的Select都使用同一个ReadView即可。

要保证READ COMMITTED隔离级别的实现,就需要在每次Select的时候都重新获取一次ReadView

标签:事务,解锁,魔法,trx,MVCC,版本,ReadView,数据,id
From: https://blog.csdn.net/qq_42581023/article/details/144834854

相关文章

  • 解锁 Java 解释器模式:赋予程序理解 “新语言” 的魔力
    解锁Java解释器模式:赋予程序理解“新语言”的魔力在Java编程的广袤天地中,我们时常面临需要处理自定义规则、语法或逻辑表达式的场景。此时,解释器模式(InterpreterPattern)宛如一位神奇的翻译官,能够将这些看似晦涩难懂的“新语言”,转化为计算机能够理解并执行的指令,为......
  • 点击锁定按钮,锁定按钮要变成解锁按钮,然后状态要从待绑定变成 已锁定
    点击锁定按钮,锁定按钮要变成解锁按钮,然后状态要从待绑定变成已锁定点击解锁按钮,解锁按钮要变成锁定按钮,然后状态要从已锁定变成待绑定{"code":0,"msg":"状态更新成功","data":{"status":3}}1、状态列的el-table-column<el-table-c......
  • [luoguP10218/省选联考 2024] 魔法手杖
    题意给定\(a_1,a_2,\dots,a_n\)以及\(b_1,b_2,\dots,b_n\),满足\(a_i\in[0,2^k-1]\)以及\(b_i\geq0\),你需要给出\(S\subseteq\{1,2,\dots,n\}\)以及\(x\in[0,2^k-1]\)满足以下条件:\(\sum\limits_{i\inS}b_i\leqm\);满足以上条件的前提下,最大化\(val(S,x)......
  • 解锁风电运维新密码:深度学习神经网络助力设备寿命精准预估
    摘要:当下,风电产业蓬勃发展,可恶劣运行环境使设备故障频发,精准预估剩余寿命迫在眉睫。深度学习中的神经网络为此带来曙光,其基础源于对大数据处理需求的回应,借由神经元、层架构自动提取特征。在风电应用里,CNN、LSTM深挖多源异构数据特征,MLP等架构构建预测模型,配合优化算法训......
  • [BZOJ 4399] 魔法少女LJJ
    魔法少女LJJDescription:题目描述在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了LJJ感叹道“这里真是个迷人的绿色世界,空气清新、淡雅,到处散发着醉人的奶浆味;小猴在枝头悠来荡去,好不自在;各式各样的鲜花争相开......
  • JMeter JSR223 Sampler 教程:性能测试的魔法棒
    JMeterJSR223Sampler教程:性能测试的魔法棒宝子们,今天咱要深入探索JMeter里超厉害的JSR223Sampler,它就像是一把万能钥匙,能打开性能测试的各种奇妙大门,让咱的测试变得超厉害!一、简介JSR223Sampler可是JMeter中的一个宝藏组件哦!它是基于JSR223规范打造的,这就......
  • 【论文投稿】解锁 SQL 高级技巧,让数据处理 “飞” 起来!
    【往届见刊后不到1个月检索】第四届遥感与测绘国际学术会议(RSSM2025)_艾思科蓝_学术一站式服务平台 目录前言巧用窗口函数,数据分析如有神助掌握子查询嵌套,层层剖析数据奥秘精通索引优化,加速查询一骑绝尘运用存储过程,简化复杂业务逻辑利用动态SQL,灵活应对多变需求掌......
  • Qt实现Android的图案密码(图形解锁)源码分享
    一、效果展示二、源码分享PatternPasswordWidget.hpp#ifndefPATTERNCODELOCKWIDGET_H#definePATTERNCODELOCKWIDGET_H#include<QWidget>#include<QWidget>#include<QTimer>classPatternPasswordWidget:publicQWidget{Q_OBJECTpublic:......
  • 解锁桶排序:全面掌握其核心知识与技巧
    一、基本原理核心思想桶排序的基本思想是将数组中的数据分到有限数量的桶里。每个桶再分别进行排序(可以使用其他排序算法,如插入排序),最后将各个桶中的数据有序地合并起来,得到最终的排序结果。工作方式类比可以把它想象成在一个有很多小格子(桶)的柜子里整理物品。首先根据物......
  • 解锁 Matplotlib:完整的知识点梳理与应用示例
    一、基础概念目的:用于创建各种高质量的静态、动态和交互式的可视化图表,如折线图、柱状图、散点图、饼图等多种图形,帮助用户更好地理解和展示数据。架构:它有一个分层的架构,最顶层是脚本层(pyplot),方便快速创建简单的图表;中间层是Artist层,用于对图表的各个组件(如线条、文本、图形等......