mysql的mvcc理解

ops/2025/1/15 4:58:05/

人阅读

一、说到mvcc就少不了事务隔离级别(大白话解释)

 

序列化(SERIALIZABLE):事务之间完全隔离,当成一个序列,一个一个执行。

1

可重复读(REPEATABLE READ):不会被看成一个序列,但是这个事务里发生的改变,另一个事务中是看不到的,即同时执行两个select结果是一样的。(默认)

1

提交读(READ COMMITTED):这个事务里发生改变并且提交,在另一个事务里是可见的,两条select中间提交过数据,两次结果可能不同。

1

未提交读(READ UNCOMMITTED):可以读到未提交的数据,容易产生幻读脏读。

1

幻读和脏读:

幻读是每次查询的数据不一样。

脏读是查询到了错误的数据。(查询到结果后有个事务回滚了)

 

二、mvcc

三个隐藏字段

DB_TRX_ID:记录最近更新这条行记录的事务ID,大小为6个字节。

DB_ROLL_PTR:表示指向该行回滚段的指针,innodb便是通过这个指针找到之前的版本数据。该行记录上所有旧版本,在undo中都通过链表的形式组织。

DB_ROW_ID:行标识,如果表没有主键,就会生成一个隐藏的主键。

 

MyISAM不支持事务,所以这里就说InnoDB

 

undo log是为了回滚用的。

 

虽然mvcc保证了读是一致的,能解决幻读,但是那是历史数据,并不是真的数据,涉及到的列,我直接锁住,别的事务在这里阻塞。

 

问:那提交读就不锁了吗? 提交读中没有加间隙锁。但肯定使用了行锁,只有提交之后才能修改

 

事务和锁区别对待:

问:可提交读为啥不能解决幻读,可重复读为啥能解决幻读

 

后者间隙锁

 

仅仅行锁无法保证幻读,除非表锁。 这里说明可提交读如果表锁就能保证幻读。行锁的时候,就无法保证幻读。

 

未提交读 直接读取最新的数据

 

已提交读 每次查询的时候生成一个readview快照

 

可重读读 第一次读的时候生成一个快照,以后的就直接取这个快照

 

串行化:因为加锁,也不存在这个问题

 

几个数据:

当前活跃的事务id们 活跃最小 活跃最大+1(就是下次事务的id) 当前的事务id

 

判断版本:

 

1、如果版本和当前的是事务一样,就说明是当前的事务做的修改,可以直接使用

2、判断是不是小于最小活跃,如果小于,则说明生成readView的时候已经提交了,可以读

3、如果大于等于活跃最大+1,就说明是在这个事务之后开启的,不可见

4、如果是处于活跃列表中,则说明创建readView的时候,不在活跃列表中,就说明当时未提交,继续往前找


http://www.ppmy.cn/ops/150203.html

相关文章

C#里使用libxl设置EXCEL里公式计算的例子

在EXCEL的使用里,经常使用的是公式功能, 为什么会这样说呢? 因为公式是一种自动化计算工具,并且可以固化人类的智慧,相当于把复杂的计算功能嵌入到固定的数据处理了。比如一个经验丰富的财务人员,可以编制一个复杂公式计算的表格,只要一个不懂财务的人员,输入每个人的…

Pyinstaller打包

打包配置 打包方法 方法一 直接打包 sh pyinstaller --onefile script.py 方法二 通过配置spec文件打包 sh pyinstaller script.spec 常见问题 问题1.Exception Type: FileNotFoundError pyinstaller打包,如何添加静态文件,比如app\\resources\…

浅谈云计算01 | 云计算服务的特点

在当今数字化时代,云计算作为一种强大的技术解决方案,正逐渐改变着企业和个人对信息技术的使用方式。本文将详细探讨云计算的五个主要特点,包括按需自助服务、广泛的网络接入、资源池化、快速弹性伸缩以及可计量服务。 一、按需自助服务 云…

利用Python爬虫按图搜索1688商品(拍立淘)的探索之旅

在当今这个信息爆炸的时代,网购已成为人们生活中不可或缺的一部分。而1688作为国内知名的B2B电商平台,汇聚了海量的商品资源。当我们面对琳琅满目的商品时,传统的文字搜索方式有时会显得力不从心。比如,当你看到一件心仪的商品图片…

【零基础入门Go语言】Go语言的一等公民:函数和方法

函数和方法是我们迈向代码复用,多人协作开发的第一步。通过函数,可以把开发任务分解成一个个小的单元,这些小单元可以被其他单元复用,进而提升开发效率、降低代码重复度。再加上现成的函数已经被充分测试和使用过,所以…

35_Lua基本语法

Lua 是一种轻量级、易于学习的脚本语言,其语法简洁明了。下面来给大家介绍下Lua的一些基本语法,我们可以创建第一个Lua程序! 1.Lua基本语法 1.1 交互式编程 Lua支持交互式编程,这使得用户可以在命令行界面(CLI)即时执行代码片段并立即看到结果。这种交互式的环境通常被…

腾讯云AI代码助手编程挑战赛-脑筋急转弯

作品简介 一个生成脑筋急转弯的网页工具,提升思维能力。 技术架构 使用Html语言完成图形化页面的样式,使用JavaScript语言来操作对应的逻辑代码。 实现过程 1、创建一个界面 2、获取数据 3、添加按钮与功能 4、程序优化调试 开发环境、开发流程 系…

面试加分项:Android Framework PMS 全面概述和知识要点

在Android面试时,懂得越多越深android framework的知识,越为自己加分。 目录 第一章:PMS 基础知识 1.1 PMS 定义与工作原理 1.2 PMS 的主要任务 1.3 PMS 与相关组件的交互 第二章:PMS 的核心功能 2.1 应用安装与卸载机制 2.2 应用更新与版本管理 2.3 组件管理 第…