MySQL RR级别下,什么场景会产生不可重复读、幻读?

news2024/11/17 7:23:31

1 背景

最近在复习MySQL相关知识,忽然想到MVCC真的能完全解决不可重复读、幻读问题吗?于是做了下述测试。

2 准备环境

MySQL版本:

➜  ~ mysql --version
mysql  Ver 8.0.31 for macos12 on x86_64 (MySQL Community Server - GPL)

MySQL隔离级别:

mysql> select @@transaction_isolation;
+-------------------------+
| @@transaction_isolation |
+-------------------------+
| REPEATABLE-READ         |
+-------------------------+
1 row in set (0.00 sec)

建立测试表:

CREATE TABLE `test_01` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(45) DEFAULT NULL,
  `age` int DEFAULT NULL,
  `msg` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

2 具体测试

2.1 能否出现“不可重复读”问题

  1. 清表并初始化数据
mysql> truncate test_01;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into test_01 values (1,'name-a',11,'msg-a'),(2,'name-b',12,'msg-b');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from test_01;
+----+--------+------+-------+
| id | name   | age  | msg   |
+----+--------+------+-------+
|  1 | name-a |   11 | msg-a |
|  2 | name-b |   12 | msg-b |
+----+--------+------+-------+
2 rows in set (0.00 sec)
  1. 开启两个事务进行测试

图1
3. 测试结果分析

  此测试中的步骤1-6均符合预期,但是在步骤7更新了id=2这条记录的msg字段后,查询时发现此记录的name字段也变成了最新的值,而之前我以为会是原始值。
  假设事务A的trx_id=1,事务B的trx_id=2,由于无法查到DB_TRX_ID的值,只能猜测原因:
  (1)步骤5完成之后,数据如下。

idnameagemsgDB_TRX_ID
1modify_by_a11msg-a1
2modify_by_a12msg-b1

  (2)步骤6由于是快照读,但是快照发生在事务A提交之前,所以此时查数据发现id=2、id=3两条记录的DB_TRX_ID均是1后会去找历史版本并返回,所以查不到事务A的更新。
  (3)步骤7的update实际执行的时候是“查询-设置字段的新值-写入”顺序,这里的查询时当前读,所以更新id=2的记录后,id=2的记录的name字段仍然是modify_by_a,而msg变为了modify_by_a,且DB_TRX_ID变更为2,如下:

idnameagemsgDB_TRX_ID
1modify_by_a11msg-a1
2modify_by_a12modify_by_b2

  (4)步骤8查询时仍然是快照读,由于id=1的记录的DB_TRX_ID=1,在事务B的Read View中,事务A(trx_id=1)尚未提交,所以与步骤6中的处理逻辑一样,依然回去找此记录的历史版本。但是由于id=2的记录的DB_TRX_ID与当前事务ID相同,所以会读取这条最新的记录,所以会将事务A修改的name=modify_by_a返回。
  (5)这里需要看对“不可重复读”问题是如何理解的。如果“不可重复读”是针对一条记录中的某个字段,那么RR级别下的MVCC可以解决此问题;如果“不可重复读”是针对同一SQL返回的全部字段,那么这个测试说明在事务中同时出现当前读和快照读时,可能出现此问题。

2.1 能否出现“幻读”问题

  1. 清表并初始化数据
mysql> truncate test_01;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into test_01 values (1,'name-a',11,'msg-a'),(2,'name-b',12,'msg-b');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from test_01;
+----+--------+------+-------+
| id | name   | age  | msg   |
+----+--------+------+-------+
|  1 | name-a |   11 | msg-a |
|  2 | name-b |   12 | msg-b |
+----+--------+------+-------+
2 rows in set (0.00 sec)
  1. 开启两个事务进行测试

图2
3. 测试结果分析

  此测试中的步骤1-6均符合预期,但是在步骤7加锁后的是当前读,所以获取到了事务A新增的数据,此时出现了幻读。

3 总结

  两次测试中出现的问题,均是由于事务中同时出现了快照读和当前读导致的,在事务中要特别注意。

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

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

相关文章

Python学习-8.2.2 库(wordcloud库的基础与实例)

第三方库的介绍及安装方式见::Python学习-8.库(第三方库介绍与下载安装) wordcloud库概述 词云概念 是由词汇组成类似云的彩色图形,可以过滤掉大量的文本信息,使读者只要一眼扫过文本就可以领略文本的主旨…

风控并行组合模型及其额度定价场景实践

昨天,我们分享过一篇文章《串行组合模型及信用评估场景实践》,里边详细介绍了串行组合模型的原理逻辑,以及在信用风险评估场景的具体实现过程。同时,从模型串联数量、排列顺序等多个维度验证了串行组合模型的合理性与有效性&#…

区块链赋能的6G零信任车联网可信接入方案

(一)文章素材摘录于 单位信息|广东工业大学北京邮电 郝敏博士团队 数据来源|电子与信息学报 基金项目|国家重点研发计划 (二)正文 随着三大运营商 5G 套餐于2019年底的相继上线,宣…

【C语言程序设计】实验 6

目录 1. 无理数e 2. 平面镜反数 3. 整数分解质因数 4. 素数回文 5. 阶乘和数 6. 输出星号图案 7. 验证哥德巴赫猜想 1. 无理数e 【问题描述】输入一个正整数&#xff0c;由下式e11/1!1/2!...1/n!求无理数e&#xff0c;保留9位小数。 【输入形式】一个正整数n(<…

pytorch基础操作(三)梯度下降(小批量)计算线性回归

1、线性模型 线性假设是指⽬标&#xff08;房屋价格&#xff09;可以表⽰为特征&#xff08;⾯积和房龄&#xff09;的加权和&#xff0c;如下⾯的式⼦&#xff1a; price warea area wage age b. 其中: warea和wage 称为权重&#xff08;weight&#xff09;&#xff0c;…

JAVA SCRIPT设计模式--结构型--设计模式之Composite组合模式(8)

JAVA SCRIPT设计模式是本人根据GOF的设计模式写的博客记录。使用JAVA SCRIPT语言来实现主体功能&#xff0c;所以不可能像C&#xff0c;JAVA等面向对象语言一样严谨&#xff0c;大部分程序都附上了JAVA SCRIPT代码&#xff0c;代码只是实现了设计模式的主体功能&#xff0c;不代…

进阶 - Git的Bug分支

本篇文章&#xff0c;是基于我自用Linux系统中的自定义文件夹“test_rep”&#xff0c;当做示例演示 具体Git仓库的目录在&#xff1a;/usr/local/git/test_rep Git的Bug分支 软件开发中&#xff0c;bug 就像家常便饭一样。有了 bug 就需要修复&#xff0c;在 Git 中&#xff…

LabVIEW与工具包版本的不兼容问题

前面的文章有介绍过&#xff0c;LabVIEW可以看做是一种编程语言&#xff0c;同时NI也在LabVIEW里提供了非常多的可快速构建专业应用的工具包模块&#xff0c;这些模块有的是用于专业数据采集的&#xff0c;有的是用于图像处理的&#xff0c;还有的可能是工业控制的。个人觉得这…

记一次InputStream流读取不完整留下的惨痛教训

前言 首先&#xff0c;问问大家下面这段流读取的代码是否存在问题呢&#xff1f; inputStream .... try {// 根据inputStream的长度创建字节数组byte[] arrayOfByte new byte[inputStream.available()];// 调用read 读取字节数组inputStream.read(arrayOfByte, 0, arrayOfB…

计算机毕业设计ssm+vue基本微信小程序的健康管理系统 uniapp 小程序

项目介绍 本文介绍了使用微信小程序技术开发健康管理系统的设计与实现过程,首先对实现该系统的技术进行分析,说明选择Java后台技术和MySQL数据库的必要性,然后对基于微信小程序的健康管理系统的需求进行分析。并接着对系统进行设计,包括架构设计、功能设计、数据库设计。最后进…

基于改进遗传算法把电力系统功率损耗降至最低(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f389;作者研究&#xff1a;&#x1f3c5;&#x1f3c5;&#x1f3c5;本科计算机专业&#xff0c;研究生电气学硕…

软件测试用例

测试用例为什么要写测试用例测试用例的基本要素QQ登录的测试用例功能正常时异常时界面易用性可移植性性能具体的设计测试用例的方法等价类边界值错误猜测法场景设计法因果图法正交排列测试用例的有效性为什么要写测试用例 测试用例是测试执行的依据测试用例可以复用&#xff0…

分布式多级缓存

学习就是带着问题前行 缓存是什么&#xff1f; 缓存击穿是什么&#xff1f; 缓存雪崩是什么&#xff1f; 如何保证分布式缓存的数据一致性&#xff1f; 如何进行缓存预热&#xff1f; 如何设计缓存热点探测&#xff1f; 曾经问过一个技术修为很高的朋友&#xff0c;为什么…

系统移植 uboot 1

一、uboot概念 1.1 uboot和bootloader关系 1.bootloader:是一系列引导加载程序的统称 &#xff0c;uboot是其中之一。 1.2 uboot特点 1.uboot是由德国DNEX小组进行维护的 2.uboot是一个开源分布式系统 3.uboot支持多种硬件架构平台(ARM/X86/POWERPC) 4.uboot短小精悍 5.…

飞轮效应,中国企业级SaaS的一次自我革命

“数智飞轮”“客户成功”&#xff0c;三年时间&#xff0c;用友YonSuite终于按下了发展的“快进键”&#xff0c;中国企业级SaaS的产业革命也就此开始。 前不久&#xff0c;用友发布了2022年三季报。在公司战略增强公有云订阅业务的前提下&#xff0c;中型企业云服务业务收入…

模拟电路设计(38)---基于LT1173的负压产生电路

今天来介绍下LT1173在buck&#xff08;step-down&#xff09;模式的工作电路。在介绍PWM电路结构时&#xff0c;有一种形式成为buck型&#xff0c;如下所示&#xff1a; 晶体管开关变换器&#xff08;buck&#xff09;电路 LT1173提供了内置开关管的集电极和发射极管脚&#x…

【图像处理OpenCV(C++版)】——2.2 OpenCV之矩阵运算详解(全)

前言&#xff1a; &#x1f60a;&#x1f60a;&#x1f60a;欢迎来到本博客&#x1f60a;&#x1f60a;&#x1f60a; &#x1f31f;&#x1f31f;&#x1f31f; 本专栏主要结合OpenCV和C来实现一些基本的图像处理算法并详细解释各参数含义&#xff0c;适用于平时学习、工作快…

一篇文章让你认识与学习bash(干货满满)

Linux界存在着这样一种说法&#xff1a;“在Linux的环境下&#xff0c;如果你不懂bash是什么&#xff0c;那么其他的东西就不用学了。”bash的学习是所有命令行模式与未来主机维护与管理的重要基础&#xff0c;所以得认真对待。 一.硬件、内核与shell 1.1 什么是shell? 看下图…

Linux下安装mysql5.7.18

查询mysql的安装文件&#xff1a; find / -name mysql有安装mysql的路径&#xff0c;有是存放MySQL安装包的路径 卸载mysql: 删除安装路劲 rm -rf /opt/mysql删除配置文件 rm -rf /etc/my.cnf删除/etc/init.d/下跟mysql有关的全部文件&#xff0c;一般包括mysql文件或mys…

浅尝Go语言的协程实现

文章目录为什么需要协程协程的本质协程如何在线程中执行GMP调度模型协程并发为什么需要协程 协程的本质是将一段数据的运行状态进行打包&#xff0c;可以在线程之间调度&#xff0c;所以协程就是在单线程的环境下实现的应用程序级别的并发&#xff0c;就是把本来由操作系统控制…