事务隔离级别和MVCC

1. 事务隔离级别和MVCC

1.1 事务并发执行时的一致性问题

(1)脏写

事务修改了另一个未提交事务修改过的数据;

这里的一致性是:假设每个事务都遵守将变量 x 和 y 始终设置为相同值,操作序列如下所示:

T1(x = 1)、T2(x = 2)、T2(y = 2)、T1(y = 1)、C1、C2

事务提交后,x = 2,y = 1 并不满足一致性要求

在发生回滚时,也会影响原子性和持久性,例如,假设 x 和 y 初始值为 0

T1(x = 1)、T2(x = 2)、T2(y = 2)、C2、A1

T1 修改 x 时会记录旧值 0,T1 进行回滚时会将 x 恢复为 0,但 T2 中也修改了 x ,就会造成部分回滚的情况(不回滚 y),违背原子性;如果都回滚的话, T2 已经提交,违背持久性的要求。

(2)脏读

事务读取了另一个未提交事务修改过的数据;

(3)不可重复读

一个事务修改了另一个事务读取过的数据;

(4)幻读

一个事务先根据某些搜索条件查询一些记录,在该事务未提交时,另一个事务写入了一些符合前述搜索条件的数据(增删改操作);

1.2 MySQL 设置隔离级别

SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL level;

不写 GLOBAL 或者 SESSION 只对执行 SET 语句后的下一个事务产生影响,下一个事务执行完后,后续事务恢复到之前的隔离级别,不能在已经开启的事务中执行,会报错。

1.3 ReadView

对 READ UNCOMMITTED 直接读取记录最新的记录即可;
对 SERIALIZABLE 使用加锁的方式来访问记录;

对 READ COMMITTED 和 REPEATABLE READ 来说,需要保证读取的记录都是已经提交事务修改的记录,通过使用 ReadView 保证。

  1. m_ids:生成 ReadView 时,当前系统中活跃的读写事务的事务 id 列表;
  2. min_trx_id:生成 ReadView 时,当前系统中活跃的读写事务的中 最小的事务 id (m_ids 中的最小值);
  3. max_trx_id:生成 ReadView 时,系统应该分配给下一个事务的事务 id 值;
    注意,max_trx_id 并非 m_ids 中的最大值,因为可能事务 id 较大的事务已经提交了(id 为 3 的事务提交了,当前活跃的为 1 和 2)。
  4. creator_trx_id:生成该 ReadView 的事务的事务 id;

如果被访问版本的 trx_id 与 ReadView 中的 creator_trx_id 相同,则表明当前事务正在访问它自己修改过的记录,可见;
如果被访问版本的 trx_id 小于 ReadView 中的 min_trx_id ,表明生成该版本的事务在当前事务生成 ReadView 前已经提交,可见;
如果被访问版本的 trx_id 大于等于 ReadView 中的 max_trx_id,表明生成该版本的事务在当前事务生成 ReadView 后才开启,不可见;
如果被访问版本的 trx_id 大于等于 min_trx_id 并小于 max_trx_id,判断 trx_id 是否在 m_ids 列表中,如果在,不可见;否则,可见。

(1)READ COMMITTED 隔离级别下,每次读取数据前都会生成一个 ReadView;

(2)在 REPEATABLE READ 隔离级别下,第一次读取数据时生成一个 ReadView;

START TRANSACTION WITH CONSISTENT SNAPSHOT 语句开启事务,会立即生成一个 ReadView。

1.4 二级索引与 MVCC

  1. 二级索引页面的 Page Header 部分有一个 PAGE_MAX_TRX_ID 的属性,记录了修改该二级索引页面的最大事务 id;当 SELECT 语句访问某个二级索引时,首先判断 ReadView 的 min_trx_id 是否大于 PAGE_MAX_TRX_ID,若大于,则该页面的所有记录都对该 ReadView 可见,否则需要进行回表后再判断可见性。

  2. 利用二级索引的主键进行回表,找到对该 ReadView 可见的第一个版本,判断该版本中相应的二级索引列的值是否与二级索引查询时的值相同,若是,返回(WHERE 中若有其他条件还需继续判断其他条件),否则接着沿着版本链判断。

1.5 关于 purge

(1)当一个事务提交后,会把这个事务执行过程中产生的一组 update undo log 插入到 History 链表头部。

每个回滚段都有一个 History 链表

(2)为了支持 MVCC ,delete mark 仅仅设置一个标志位,并没有真正删除;

(3)何时进行 purge

  1. 在事务提交时,会为该事务生成一个名为 trx_no 的值,表示事务提交的顺序;
    一组 undo log 中对应的 Undo Log Header 部分有一个属性 TRX_UNDO_TRX_NO,当事务提交时,记录了事务的 trx_no;
    History 链表是根据事务提交顺序来存放各组 undo log 的;

  2. 生成 ReadView 时,还会包含一个 trx_no 属性,表示当前系统中最大的 trx_no + 1 赋给该值。 (用来表明生成该 ReadView 时,哪些事务已经提交)

InnoDB 把当前系统中所有的 ReadView 按照创建时间连成一个链表,当执行 purge 操作时,就把系统中最早生成的 ReadView 取出来(如果没有则新创建一个 ReadView ),然后从各回滚段的 History 链表取出 trx_no 较小的各组 undo log,如果该组日志的 trx_no 小于 ReadView 中的 trx_no,就会释放该组日志,如果该组日志包含因 delete mark 操作产生的 undo log,也要把相应记录真正删除。

2. 锁

(1)锁结构
trx 信息:该锁结构与哪个事务关联;
is_waiting:当前事务是否在等待;

获取锁成功或者加锁成功,在内存中生成了与该记录对应的锁结构,而且该锁结构的 is_waiting 属性为 false;
加锁失败,在内存中生成了与该记录对应的锁结构,而且该锁结构的 is_waiting 属性为 true;
不加锁,不需要在内存中生成对应的锁结构,可以直接执行操作;

2.1 写操作

(1)DELETE:先在 B+ 树中定位这条记录的位置,获取记录的 X 锁(获取 X 锁的锁定读),执行 delete mark 操作;
(2)INSERT:一般情况下,新插入的一条记录受隐式锁保护,不需要在内存中生成对应的锁结构;
(3)UPDATE:

不修改主键,且被更新的各个列占用存储空间与之前相同
未修改主键,且至少有一个被更新的列占用存储空间与之前不同,

修改主键,相当于在原纪录上执行 DELETE 操作后再来一次 INSERT 操作,加锁操作需要按照 DELETE 和 INSERT 的规则进行。

2.2 MySQL 中的行锁和表锁

MyISAM、MEMROY 这些存储引擎一般支支持表级锁,而且一般都是针对当前会话来说的,因此最好用在只读场景下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/146000.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Vue配置项】 computed计算属性 | watch侦听属性

目录 前言 computed计算属性 什么是计算属性? Vue的原有属性是什么? 得到的全新的属性是什么? 计算属性怎么用? 计算属性的作用是什么? 为什么说代码执行率高了? computed计算属性中的this指向 co…

Express.js 与 Nest.js对比

Express.js 与 Nest.js对比 自从 Node.js 发布以来,Javascript 在后端领域的使用有所增加。由于 Node.js 的使用越来越多,每天都会有新的框架和工具发布。Express 和 Nest 是使用 Node.js 创建后端应用程序的最著名的框架之一,在本文中&…

【前段基础入门之】=>CSS3新特性 响应式布局

文章目录 概念媒体查询媒体类型媒体特性媒体运算符 概念 所谓对响应式布局方案的理解,众说纷纭,核心点就是同一套代码在不同尺度屏幕下的布局呈现方式的不同 社区中有很多人分享,并列出了多种实现响应式布局的方案,比如【 rem&…

基于ssm+vue员工工资管理系统

基于ssmvue员工工资管理系统 摘要 随着信息技术的不断发展,各行各业对于高效管理和利用数据的需求也日益增长。员工工资管理系统作为企业管理中的一个重要组成部分,对于实现工资信息的精确计算、及时发放和有效管理具有重要意义。本文基于SSM&#xff08…

消息中间件概述

概述 消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。当今市面上有很多主流的消息中间件,如ActiveMQ、RabbitMQ,Kafka,还有阿里…

3. Spring源码篇之ComponentScan

简介 前面介绍了scanner可以扫描某个包路径下的所有bean,我们最常用的也是通过ComponentScan指定包路径去扫描,在SpringBoot中也是如此,本文将介绍spring扫描的逻辑 BeanDefinitionRegistryPostProcessor 知道了ComponentScan的作用&#…

Word文档处理:用Python轻松提取Word文档图文数据

将内容从Word文档中提取出来可以方便我们对其进行其他操作,如储将内容存在数据库中、将内容导入到其他程序中、用于AI训练以及制作其他文档等。使用Spire.Doc for Python提供了一个简单的方法直接提取Word文档中的文本内容,包括文本和图片,而…

Mybatisplus集成springboot完成分页查询

今天解决的是&#xff1a;Mybatisplus集成pringboot完成分页功能 &#x1f6f4;&#x1f6f4;&#x1f6f4; 之前一直用Pagehelper&#xff0c;迫于无奈pagehelper与springboot冲突太多&#xff0c;就改了MP自带的分页 &#x1f388;引入依赖 引入mybatisplus依赖 <depen…

【Linux】重定向|重新理解Linux下一切皆文件

文章目录 一、什么是重定向输出重定向的原理认识一下输出重定向的系统调用输出重定向的另外写法 二、浅谈输入重定向三、重定向和进程替换有冲突吗四、Linux下一切皆文件总结 一、什么是重定向 理解重定向之前&#xff1a;先理解一个叫做文件描述符的具体操作。 文件描述符&a…

【Qt之QWizardPage】使用

介绍 QWizardPage类是向导页面的基类。 QWizard表示一个向导。每个页面都是一个QWizardPage。当创建自己的向导时&#xff0c;可以直接使用QWizardPage&#xff0c;也可以子类化它以获得更多控制。 页面具有以下属性&#xff0c;由QWizard呈现&#xff1a;a title&#xff0c;…

JVM虚拟机-虚拟机执行子系统-第6章 字节码指令

字节码指令 Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字&#xff08;称为操作码&#xff0c;Opcode&#xff09;以及跟随其后的零至多个代表此操作所需的参数&#xff08;称为操作数&#xff0c;Operand&#xff09;构成。 字节码与数据类型 在Java虚拟…

uni-app 蓝牙打印, CPCL指令集使用

先上代码: GitHub - byc233518/uniapp-bluetooth-printer-demo: 使用uniApp 连接蓝牙打印机 Demo, CPCL 指令简单实用示例 (内含 芝珂,佳博,精臣 多个厂家指令集使用文档) 文件结构: ├── App.vue ├── CPCL 指令手册.pdf // 指令集参考手册 ├── LICENSE ├── R…

如何解决小程序异步请求问题

小程序异步请求问题指的是在小程序中进行异步请求时可能会出现的问题&#xff0c;比如请求失败、请求超时等。以下是一些解决方案&#xff1a; 检查网络连接&#xff1a;首先需要确保网络连接正常&#xff0c;只有网络连接正常时才能正常进行异步请求。 检查请求参数&#xff…

基于探路者算法优化概率神经网络PNN的分类预测 - 附代码

基于探路者算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于探路者算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于探路者优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络…

html所有标签和DOCTYPE的总结

一、DOCTYPE 1. 意义 DOCTYPE是一种标准通用标记语言的文档类型声明&#xff0c;告诉标准通用标记语言解析器它应该使用什么样的文档类型定义来解析文档。 2. 应用 现在&#xff0c;我们需要告诉标准通用标记语言解析器&#xff0c;我们接下去要用html来编写代码了。 <…

建造者模式(创建型)

目录 一、前言 二、建造者模式 三、链式编程实现建造者模式 四、总结 一、前言 当我们开发一个软件应用时&#xff0c;我们通常需要创建各种对象。有些对象是简单的&#xff0c;可以直接实例化&#xff0c;但有些对象则比较复杂&#xff0c;需要多个步骤才能创建完成。这时…

【备忘】websocket学习之挖坑埋自己

背景故事 以前没有好好学习过websocket&#xff0c;只知道它有什么用途&#xff0c;也知道是个好东西&#xff0c;平时在工作中没用过&#xff0c;所以对它并不知所以然。如今要做个自己的项目&#xff0c;要在付款的时候实时播报声音。自己是个开发者&#xff0c;也不想用别人…

解决升级docker导致的k8s崩溃问题

最近由于安装harbor升级了docker&#xff0c;然后发现k8s集群就启动不了。 查看kubelet日志发现&#xff1a;直接连不上apiserver了&#xff0c;直接connection refused 然后尝试启动apiserver容器直接报错&#xff1a;Error response from daemon: unknown or invalid runtim…

【原创】java+swing+mysql校园活动管理系统设计与实现

前言&#xff1a; 本文介绍了一个校园活动管理系统的设计与实现。该系统基于JavaSwing技术&#xff0c;采用C/S架构&#xff0c;使用Java语言开发&#xff0c;以MySQL作为数据库。系统实现了活动发布、活动报名、活动列表查看等功能&#xff0c;方便了校园活动的发布和管理&am…

list.toArray

直接去看原文 原文链接:List的toArray()方法_list.toarray-CSDN博客 -------------------------------------------------------------------------------------------------------------------------------- toArray()介绍 toArray()方法是List接口中提供的方法&#xff…