当前位置:网站首页>字节二面被问到mysql事务与锁问题,我蚌埠住了
字节二面被问到mysql事务与锁问题,我蚌埠住了
2022-08-04 17:13:00 【InfoQ】


准备工作
CREATE TABLE `t_student` (
`id` int NOT NULL,
`no` varchar(255) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
`age` int DEFAULT NULL,
`score` int DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

开始实验
- MySQL 版本:8.0.26
- 隔离级别:可重复读(RR)

为什么会发生死锁?
Time 1 阶段加锁分析
# 事务 A
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> update t_student set score = 100 where id = 25;
Query OK, 0 rows affected (0.01 sec)
Rows matched: 0 Changed: 0 Warnings: 0

- 表锁:X 类型的意向锁;
- 行锁:X 类型的间隙锁;
- 如果 LOCK_MODE 为X,说明是 next-key 锁;
- 如果 LOCK_MODE 为X, REC_NOT_GAP,说明是记录锁;
- 如果 LOCK_MODE 为X, GAP,说明是间隙锁;
Time 2 阶段加锁分析
# 事务 B
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> update t_student set score = 100 where id = 26;
Query OK, 0 rows affected (0.01 sec)
Rows matched: 0 Changed: 0 Warnings: 0

- 表锁:X 类型的意向锁;
- 行锁:X 类型的间隙锁;
Time 3 阶段加锁分析
# Time 3 阶段,事务 A 插入了一条记录
mysql> insert into t_student(id, no, name, age,score) value (25, 'S0025', 'sony', 28, 90);
/// 阻塞等待......

- 每插入一条新记录,都需要看一下待插入记录的下一条记录上是否已经被加了间隙锁,如果已加间隙锁,那 Insert 语句会被阻塞,并生成一个插入意向锁 。
Time 4 阶段加锁分析
# Time 4 阶段,事务 B 插入了一条记录
mysql> insert into t_student(id, no, name, age,score) value (26, 'S0026', 'ace', 28, 90);
/// 阻塞等待......

总结
边栏推荐
- 动态数组底层是如何实现的
- 安装win11提示开启安全模式如何解决
- Selenium Webdriver驱动自管理
- 要有遥不可及的梦想,也要有脚踏实地的本事
- .NET云原生应用发展论坛--8月7日邀你一起云上探索
- 【Gazebo入门教程】第二讲 模型库导入与可视化机器人建模(模型编辑器)
- R语言ggpubr包的ggtexttable函数可视化表格数据(直接绘制表格图或者在图像中添加表格数据)、使用ggarrange函数将表格数据和可视化图像组合起来(表格数据在可视化图像下方)
- R语言dplyr包group_by函数和summarise_at函数计算dataframe计算不同分组的计数个数和均值、使用%>%符号将多个函数串起来
- 机器学习(十六):主成成分分析(PCA)
- dotnet core 隐藏控制台
猜你喜欢
Catering Supply Chain Management System
win11如何退出安全模式
跨域传递数据(iframe)
】 【 LeetCode daily one problem - 540. The order of a single element of the array
开发一套高容错分布式系统
Clearance sword refers to Offer——The sword refers to Offer II 010. and the sub-array of k
罗振宇折戟创业板/ B站回应HR称用户是Loser/ 腾讯罗技年内合推云游戏掌机...今日更多新鲜事在此...
Codeforces Round #811 (Div. 3)
Boost库学习笔记(一)安装与配置
华硕win11安全启动如何开启
随机推荐
Catering Supply Chain Management System
xgboost模块param中的一些错误
WEB 渗透之越权
机器学习(十四):K均值聚类(kmeans)
Boost库学习笔记(一)安装与配置
yarn detailed introductory tutorial
化学制品制造业数智化供应链管理系统:打造智慧供应体系,赋能企业产效提升
安装win11提示开启安全模式如何解决
Copycat CNN: Stealing Knowledge by Persuading Confession with Random Non-Labeled Data阅读心得
最小区间覆盖
R语言ggplot2可视化:使用ggpubr包的ggbarplot函数可视化柱状图、color参数指定柱状图的边框的色彩
Cesium快速上手0-Cesium安装与基本介绍
智慧场馆的无人值守怎么做?
SRM供应商协同管理系统功能介绍
Liunx删除乱码文件
Compose 类型稳定性注解:@Stable & @Immutable
Unity Apple登录接入
为什么买域名必须实名认证?这样做什么原因?
Flutter实战-请求封装(四)之gzip报文压缩
《机器学习的随机矩阵方法》