InnoDB锁机制和事务管理介绍_案例解答

news2024/11/16 21:25:30

前言

本文对《Innodb 锁机制和事务管理介绍》这篇文章中的思考题进行解答。查看完解答后如果对原理有疑问的,可以重新看下原文帮助理解。



初始化信息

验证环境:8.0.28 MySQL Community Server,InnoDB引擎,RR隔离级别。
初始化信息:

-- 问题一、二
drop table if exists layout_test;
drop PROCEDURE if exists layout_test_mock;

create table layout_test (
    `col1` int NOT NULL AUTO_INCREMENT,
    `col2` int not null,
    primary key(`col1`),
    key(`col2`)
) engine = innodb AUTO_INCREMENT = 0;

DELIMITER $$  
CREATE PROCEDURE layout_test_mock()  
BEGIN  
    DECLARE i INT DEFAULT 0;  
    WHILE i < 10000 DO  
        INSERT INTO layout_test (col2) VALUES (FLOOR(RAND() * 100) + 1);  
        SET i = i + 1;  
    END WHILE;  
END$$  
  
DELIMITER ;
call layout_test_mock();
OPTIMIZE table layout_test;

-- 问题三
DROP TABLE IF EXISTS test_lock;
CREATE TABLE `test_lock` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `b` INT DEFAULT NULL,
  `c` INT DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_1` (`b`)
) ENGINE=INNODB AUTO_INCREMENT=0;
INSERT INTO test_lock VALUES (50, 50, 50), (55, 55, 55), (60, 60, 60), (62, 62, 62), (65, 65, 65), (66, 66, 66);


问题一

问题

下面的操作,为什么update更新的是0行,如何来构造这个场景?

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM layout_test WHERE col2 = 37 limit 5;
+------+------+
| col1 | col2 |
+------+------+
|  343 |   37 |
|  411 |   37 |
|  479 |   37 |
|  575 |   37 |
|  641 |   37 |
+------+------+
5 rows in set (0.00 sec)

mysql> update layout_test set col2 = col2+2 where col2 = 37;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0  Changed: 0  Warnings: 0

mysql> SELECT * FROM layout_test WHERE col2 = 37 limit 5;
+------+------+
| col1 | col2 |
+------+------+
|  343 |   37 |
|  411 |   37 |
|  479 |   37 |
|  575 |   37 |
|  641 |   37 |
+------+------+
5 rows in set (0.00 sec)

解答

场景构造:
在这里插入图片描述


解答: 涉及MVCC部分的当前读、快照读,以及事务的可见性规则这些知识点。 select查询,使用的快照读。会话B的操作,对于会话A而言不可见。而update,使用的是当前读。

问题二

问题

下面的操作,为什么加锁查询比不加锁快很多,如何来构造这个场景?

mysql> START TRANSACTION WITH CONSISTENT SNAPSHOT;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM layout_test WHERE col1 = 1;
+------+--------+
| col1 | col2   |
+------+--------+
|    1 | 1      |
+------+--------+
1 row in set (8.24 sec)

mysql> SELECT * FROM layout_test WHERE col1 = 1 LOCK IN SHARE MODE;
+------+---------+
| col1 | col2    |
+------+---------+
|    1 | 1000001 |
+------+---------+
1 row in set (0.00 sec)

解答

场景构造:
在这里插入图片描述


-- 存储过程
CREATE PROCEDURE `layout_test_mock_update`()
BEGIN  
    DECLARE i INT DEFAULT 0;  
    WHILE i < 1000000 DO  
        SET i = i + 1;
        update layout_test set col2 = col2+1 where col1 = 1;
    END WHILE;  
END

解答: 涉及MVCC部分的当前读、快照读; 而会话B中执行了100万次更新(事务),生成了100万个回滚日志。 会话A中执行select,使用的快照读,需要根据版本链找可见的版本,执行100万次之后才找到;而lock in share mode,使用的当前读,故速度很快。

状态示意图:
在这里插入图片描述



问题三

问题

session B中的操作,为什么有的成功,有的被阻塞?
ps: 先执行A,在执行B

-- session A
BEGIN;
SELECT * FROM test_lock WHERE b=55 FOR UPDATE;
-- session B
BEGIN;

INSERT INTO test_lock VALUES(40, 40, 40); -- ok
INSERT INTO test_lock VALUES(45, 50, 45); -- ok
INSERT INTO test_lock VALUES(51, 50, 51); -- blocked
INSERT INTO test_lock VALUES(52, 52, 52); -- blocked
INSERT INTO test_lock VALUES(57, 57, 57); -- blocked
INSERT INTO test_lock VALUES(58, 60, 58); -- blocked
INSERT INTO test_lock VALUES(61, 60, 61); -- ok

解答

test_lock表数据如下
在这里插入图片描述

session A的加锁信息如下图,字段b对应的索引idx_1上的锁定范围:(50, 55], (55, 60);符合《Innodb 锁机制和事务管理介绍》中的预期:
在这里插入图片描述

锁定范围示意图如下:
在这里插入图片描述

基于上面的图,可以清晰的看到(45, 50, 45)、(51, 50, 51)这两组数据插入的位置,以及成功或被阻塞的原因。
(51, 50, 51)这一组数据的锁等待信息如下:
在这里插入图片描述

其他组也是同样的道理,不再赘述。



参考资料

  • 极客时间课程《MySQL实战45讲》
    • 问题一:来源于第8课的思考题
    • 问题二:来源于第19课的内容
  • MySQL中关于gap lock/next-key lock的一个问题
    • 问题三的来源

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

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

相关文章

苍穹外卖项目DAY03

苍穹外卖项目Day03 1、菜品管理 1.1、公共字段自动填充 1.1.1、问题分析 业务表中的公共字段&#xff1a; 问题&#xff1a;代码冗余、不便于后期维护 1.1.2、实现思路 自定义注解AutoFill&#xff0c;用于标识需要进行公共字段自动填充的方法自定义切面类AutoFillAspect&…

Mybatis和Mybatis-plus区别和联系

MyBatis 和 MyBatis-Plus 是两个用于 Java 数据持久层的框架&#xff0c;它们在功能和使用场景上有所不同。如果项目需要高度自定义和复杂的 SQL 逻辑处理&#xff0c;且开发团队熟悉 SQL&#xff0c;那么 MyBatis 是一个更好的选择。相反&#xff0c;如果希望提高开发效率&…

EPLAN P8 2024-操作记录

目录 设备标识符包含页面 效果如下​编辑 步骤如下 连接点代号的分隔符创建 效果如下 步骤如下 中断点连接排序 效果如下 步骤如下 触点关联参考位置调整、 效果如下 步骤如下 端子排定义 效果如下 步骤如下 端子排连接 效果如下 离散端子操作如下 连接…

操作系统基础知识:调度器、闲逛进程,闲逛进程的特性,什么事件会触发“调度程序”?

被调度程序选中和时间用完由调度程序引起&#xff0c;调度程序决定&#xff1a; 让谁运行由调度算法决定&#xff1b;运行多长时间由时间片大小决定。 什么事件会触发“调度程序”? 1.创建新进程 2.进程退出 3.运行进程阻塞 4.I/0中断发生(可能唤醒某些阻塞进程) 非抢占式调…

「每周只上一天班」谷歌散漫制度遭前CEO怒斥:输给OpenAI,再下去要输创业公司了

「谷歌决定拥抱生活与工作平衡&#xff1a;更早下班、远程工作&#xff0c;胜过在竞争中取胜。」施密特说道。「而说到初创公司&#xff0c;他们之所以能成功&#xff0c;是因为人们在拼命地工作。」 在本周三公布的一份斯坦福大学公开课视频中&#xff0c;谷歌前 CEO 埃里克・…

机器学习 之 sklearn的使用介绍和如何找到API

scikit-learn&#xff08;简称 sklearn&#xff09;是基于python语言的一个第三方机器学习库&#xff0c;它提供了简单而有效的工具来进行数据分析和建模。建立在numpy pandas SciPy和Malpotlib库上&#xff0c;下面是对如何使用 sklearn 以及如何找到其 API 的一个基本介绍&am…

算法:DFS解决FloodFill算法

目录 题目一&#xff1a;图像渲染 题目二&#xff1a;岛屿数量 题目三&#xff1a;岛屿的最大面积 题目四&#xff1a;被围绕的区域 题目五&#xff1a;太平洋大西洋水流问题 题目六&#xff1a;扫雷游戏 题目七&#xff1a;衣橱整理 题目一&#xff1a;图像渲染 有一幅…

Unity MessagePack代替Json让你的数据更小还更快

Unity MessagePack代替Json让你的数据更小还更快 前言项目下载并安装MessagePack编写测试代码添加并设置脚本生成AOT代码编写加载AOT代码文件运行效果 参考 前言 前端给后端发的Json数据有点大&#xff0c;使用MessagePack优化一下&#xff08;MessagePack原理官网解释的很清晰…

前端案例:极速问诊项目(移动端自适应)(HTML+CSS+JS)

一个简单的移动端案例&#xff0c;模拟不同设备下逻辑分辨率不同&#xff0c;宽高自适应 正常打开整体布局 打开 f12 &#xff08;ctrl shift M&#xff09;或者点击左上角图标,将其模拟为移动端设备 在移动设备iPhone6/7/8&#xff0c;逻辑分辨率375的整体布局 其banner图尺…

1.9万亿字节跳动,没钱了?

字节再融资 近期投行圈热度最高的事情&#xff0c;是字节跳动正在积极与相关金融机构展开洽谈&#xff0c;期望对其现有的 50 亿美元贷款进行再融资&#xff0c;期限三年。 若是再融资能成&#xff0c;大概率会成为中国借款人年内进行的最大规模贷款再融资交易事件。 这下可好了…

Cesium for Unreal 打包像素流去掉 CLICK TO START

文章目录 1. 像素流去掉 CLICK TO START问题分析1. 像素流去掉 CLICK TO START 问题 分析 在后缀添加参数:MatchViewportRes=true&HoveringMouse=true 例如: http://192.168.0.106:5027/?MatchViewportRes=true&HoveringMouse

【课程总结】day24(上):大模型三阶段训练方法(LLaMa Factory)

前言 本章我们将通过 LLaMA-Factory 具体实践大模型训练的三个阶段&#xff0c;包括&#xff1a;预训练、监督微调和偏好纠正。 大模型训练回顾 训练目标 训练一个医疗大模型 训练过程实施 准备训练框架 LLaMA Factory是一款开源低代码大模型微调框架&#xff0c;集成了业…

Spring Security 01.两个功能

在 Spring Security 的架构设计中&#xff0c;认证&#xff08;Authentication&#xff09;和授权&#xff08;Authorization&#xff09;是分开 的&#xff0c;在本书后面的章节中读者可以看到&#xff0c;无论使用什么样的认证方式&#xff0c;都不会影响授权&#xff0c;这是…

国际网络组网如何布署?

国际网络组网的布署涉及多个关键的步骤和注意事项&#xff0c;以确保网络的可靠性、可扩展性和安全性。通过深入分析网络需求、基础设施选择、网络设备配置、数据安全及灾难恢复计划等方面&#xff0c;可以实现有效的国际网络组网布署。 在网络需求分析的阶段&#xff0c;首先需…

Flow Simulator 案例分享:换热器的一维仿真

换热器的 CFD 仿真 换热器广泛用于动力设备、空调系统和电子设备等冷、热介质的热量交换。由于结构上存在大量的管束和翅片结构&#xff0c;在 CFD 仿真中通常不会创建全细节模型&#xff0c;而是采用多孔介质和换热效率模型来简化。 各种类型的换热器 Flow Simulator中的换热器…

探索Python的隐秘武器:itsdangerous的威力与妙用

文章目录 **探索Python的隐秘武器&#xff1a;itsdangerous的威力与妙用**第一部分&#xff1a;背景介绍第二部分&#xff1a;itsdangerous是什么&#xff1f;第三部分&#xff1a;如何安装itsdangerous&#xff1f;第四部分&#xff1a;itsdangerous的五个简单函数第五部分&am…

DVWA中文件上传漏洞之High渗透测试

1、代码分析 我们可以看到DVWA中文件上传漏洞的代码&#xff0c;现在我们对这个进行渗透测试。 方法1&#xff1a;直接用脚本改成图片格式看是否可行。改成jpg或者jpeg或者png 通过这种方式&#xff0c;我们发现上传的时候会被拦截&#xff0c;所以这个方式不可取 方法2&…

【MATLAB源码-第248期】基于matlab的EMD算法+ICA算法轴承故障分析。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 经验模态分解&#xff08;EMD&#xff09;与轴承故障识别 EMD的基本原理 EMD 是一种自适应的信号分解技术&#xff0c;最初由 Huang 等人在 1998 年提出&#xff0c;旨在分析非线性和非平稳信号。传统的信号处理方法通常假…

Spring框架的应用(面试题)

目录 14. Spring框架中的Bean的作用域 通过XML方式设置bean的作用域 通过注解方式设置bean的作用域 15. Spring框架中的Bean的线程安全 16.Spring 框架中的Bean生命周期 17.Spring 框架如何解决循环依赖? 18.Spring 框架中有哪些注解? 19.Spring 框架中用到的设计模式…

uniapp在线下载安装包更新app

首先用getSystemInfo判断平台、 再通过json文件模拟接口 判断版本号是否一致 不一致则下载服务器apk进行更新 外加网络波动导致失败重新下载更新包 uni.getSystemInfo({success: function (e) {// #ifndef H5// 获取手机系统版本const system e.system.toLowerCase();const pl…