当前位置:网站首页>字节二面被问到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);
/// 阻塞等待......

总结
边栏推荐
- 动态数组底层是如何实现的
- Codeforces Round #811 (Div. 3)
- 44. 通配符匹配 ●●● & HJ71 字符串通配符 ●●
- localhost,127.0.0.1,本机IP
- 跨域传递数据(iframe)
- 拼多多详情API接口深度解读
- R语言使用cov函数计算矩阵或者dataframe数据变量之间的协方差、cor函数计算相关性、cor函数通过method参数指定相关性、相关性计算方法Pearson,Spearman, Kendall
- xgboost模块param中的一些错误
- 移动平台助力推进智慧型科研院所信息化建设
- How to convert an int attribute into a string in the json format returned by the Go language gin framework?
猜你喜欢
安装失败怎么办
Catering Supply Chain Management System
安装win11提示开启安全模式如何解决
88. (the home of cesium) cesium polymerization figure
全世界国家和地区国家顶级域名对照表
GraphQL 入门与实践
华为云数据治理生产线DataArts,让“数据‘慧’说话”
化学制品制造业数智化供应链管理系统:打造智慧供应体系,赋能企业产效提升
】 【 LeetCode daily one problem - 540. The order of a single element of the array
基于clipboard.js对复制组件的封装
随机推荐
【商家联盟】云平台—异业联盟,打造线上线下商业相结合的系统
R语言ggplot2可视化:使用ggpubr包的ggbarplot函数可视化柱状图、color参数指定柱状图的边框的色彩
全世界国家和地区国家顶级域名对照表
88.(cesium之家)cesium聚合图
通关剑指 Offer——剑指 Offer II 010. 和为 k 的子数组
麒麟信安石勇博士荣获openEuler社区年度开源贡献之星
WEB 渗透之XXE&XML
码蹄集 - MT3029 - 新月轩就餐
CF86D Powerful array
罗振宇折戟创业板/ B站回应HR称用户是Loser/ 腾讯罗技年内合推云游戏掌机...今日更多新鲜事在此...
机器学习(十八):随机搜索和XGBoost
GraphQL 入门与实践
Catering Supply Chain Management System
shell脚本详解-------循环语句wuile循环和until循环
C. LIS or Reverse LIS?
并发编程原理学习-reentrantlock源码分析
taro 滚动组件ScrollView
Qt自动补全之QCompleter使用
拼多多详情API接口深度解读
How to convert an int attribute into a string in the json format returned by the Go language gin framework?