带你读《2022技术人的百宝黑皮书》——mysql锁机制的再研究(5)

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 带你读《2022技术人的百宝黑皮书》——mysql锁机制的再研究(5)
+关注继续查看

带你读《2022技术人的百宝黑皮书》——mysql锁机制的再研究(4)https://developer.aliyun.com/article/1340030?groupCode=taobaotech


问题分析

复现

 

表中已有数据:

 

----+---------------------+---------------------+----------+-------------+-------------+
| id | gmt_create | gmt_modified  | lock_key | lock_biz  | lock_context|
+----+---------------------+---------------------+----------+-------------+-------------+
| 12 | 2022-02-15 19:54:42 | 2022-02-15 19:54:42 | 123 |  accountUser | 0 |
| 50 | 2022-02-15 19:55:05 | 2022-02-15 19:55:05 | 150 |  accountUser | 0 |
| 75 | 2022-02-15 19:55:19 | 2022-02-15 19:55:19 | 200 |  accountUser | 0 |

 

 

从死锁日志可以看出,是由于insert操作引发死锁,故重点研究与讲解。

 

 

步骤

T1

T2

T3

T4

1

begin;

 

begin;

 

 

2

insert into test_lock(

`gmt_create` ,`gmt_- modified` ,`lock_key` ,

`lock_biz` ) VALUE (now(),now(), '140',

'AccountUser');

 

insert into test_lock(

`gmt_create` ,`gmt_- modified` ,`lock_key` ,

`lock_biz` ) VALUE (now(),now(), '144',

'AccountUser');

 

3

 

begin;

 

begin;

 

4

 

insert into test_lock`(

`gmt_create` ,`gmt_- modified` ,`lock_key` ,

`lock_biz` ) VALUE (now(),now(), '140',

'AccountUser');

 

insert into `test_lock`(

`gmt_create` ,`gmt_- modified` ,`lock_key` ,

`lock_biz` ) VALUE (now(),now(), '144',

'AccountUser');

 

5

存 在 lock_key=140, lock_biz='AccoutUser'的X record行锁

因为出现唯一性冲突,故加S Next-key Lock,锁住(123-140],(140,150]之间

的空间,

存 在 lock_key=144, lock_biz='AccoutUser'的X record行锁

因为出现唯一性冲突,故加S Next-key Lock,锁住(123-144],(144,150]之间

的空间

6

rollback;

申请插入意向锁,阻塞

 

 

7

 

 

rollback;

申请插入意向锁,阻塞

8

 

成功获取锁,并插入

 

deadLock

 

 

 

T1: insetrt后,存在lock_key=140, lock_biz='AccoutUser'的X记录锁

T2: 与T1发生唯一键冲突,故加上S Next-key Lock(也就是lock mode S waiting),锁住(123-140],(140,150]之间的空间。

T3: insert后,存在lock_key=144, lock_biz='AccoutUser'的X记录锁

T4: 与T3发生唯一键冲突,故加上S Next-key Lock(也就是lock mode S waiting),锁住(123-144],(144,150] 之间的空间。

T2:T1 回滚后,T2与T4锁冲突,等待T4 S-Next-key Lock锁释放,然后申请意向锁,在日志中显示lock_- mode X locks gap before rec insert intention waiting.

T4:T3回滚后,T2和T4同时申请意向锁,死锁出现。

通过show engine innodb status;命令查看死锁日志,可以看到与线上表现一致。

 

 

------------------------
    LATEST DETECTED DEADLOCK 3  ------------------------
    2022    02-15 20:34:19 0x70000ec62000
*** (1) TRANSACTION:
TRANSACTION 8501, ACTIVE 10 sec inserting
mysql tables in use 1, locked 1
LOCK WAIT 4 lock struct(s), heap size 1136, 2 row lock(s), undo log entries 1
MySQL thread id 5, OS thread handle 123145550733312, query id 93 localhost root update
insert into `test_lock`( `gmt_create` ,`gmt_modified` ,`lock_key` , `lock_biz` ) VALUE (now(),now(), '144', 'AccountUser')
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 23 page no 4 n bits 80 index idx_uk_lock_name of table `dian- jing_test`.`test_lock` trx id 8501 lock_mode X locks gap before rec insert intention waiting
Record lock, heap no 3 PHYSICAL RECORD: n_fields 3; compact format; info bits 0 14      0: len 3; hex 313530; asc 150;;
    1: len 11; hex 6163636f756e7455736572; asc accountUser;;
    2: len 8; hex 8000000000000032; asc 2;;

*** (2) TRANSACTION:
TRANSACTION 8495, ACTIVE 31 sec inserting
mysql tables in use 1, locked 1
5 lock struct(s), heap size 1136, 2 row lock(s), undo log entries 1
MySQL thread id 3, OS thread handle 123145550176256, query id 89 localhost root update
insert into `test_lock`( `gmt_create` ,`gmt_modified` ,`lock_key` , `lock_biz` ) VALUE (now(),now(), '140', 'AccountUser')
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 23 page no 4 n bits 80 index idx_uk_lock_name of table `dian- jing_test`.`test_lock` trx id 8495 lock mode S locks gap before rec
Record lock, heap no 3 PHYSICAL RECORD: n_fields 3; compact format; info bits 0 0: len 3; hex 313530; asc 150;;
1: len 11; hex 6163636f756e7455736572; asc accountUser;;
2: len 8; hex 8000000000000032; asc 2;;
*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 23 page no 4 n bits 80 index idx_uk_lock_name of table `dian- jing_test`.`test_lock` trx id 8495 lock_mode X locks gap before rec insert intention waiting
Record lock, heap no 3 PHYSICAL RECORD: n_fields 3; compact format; info bits 0 0: len 3; hex 313530; asc 150;;
1: len 11; hex 6163636f756e7455736572; asc accountUser;;
2: len 8; hex 8000000000000032; asc 2;;


小注解:mysql的锁,放在系统库information_schema的INNODB_LOCKSINNODB_LOCK_WAITS两个表中,可直接select查看。

 

带你读《2022技术人的百宝黑皮书》——mysql锁机制的再研究(6)https://developer.aliyun.com/article/1340028?groupCode=taobaotech

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
12小时前
|
存储 分布式计算 关系型数据库
云原生数据仓库AnalyticDB MySQL湖仓版架构升级,持续释放技术红利!
云原生数据仓库AnalyticDB MySQL湖仓版架降价23%!持续提供高性价比的产品服务
|
1天前
|
存储 SQL 关系型数据库
MySQL5.7到8.0的升级迁移!高效的MySQL跨版本迁移技术解读
NineData是一种高效、稳定且易于使用的迁移工具,可帮助用户将MySQL 5.7迁移到MySQL 8.0。由于MySQL 5.7已经结束生命周期并不再获得技术支持,因此迁移至MySQL 8.0是必要的。NineData提供了数据复制功能,包括数据迁移和实时同步,还支持双向复制。与传统迁移方法相比,NineData具有简单易用、数据一致、强劲性能和高可靠性的优势。它提供了完善的观测和干预能力,保障迁移的成功。此外,NineData还提供了对比功能,确保数据的一致性。通过简单的配置过程,用户可以实现自动化的数据迁移。NineData还提供了完善的观测和干预能力,帮助用户追踪迁移进展并诊断和修复
72 2
|
4天前
|
关系型数据库 MySQL 数据库
阿里技术官甩出的768页MySQL优化笔记,火遍全网不是意外
MySQL之所以能成为现在最流行的开源数据库,这跟它的开放性、包容性是分不开的。它的入门门槛低到用一条命令就能把MySQL安装起来,你能在程序开发的入门资料中很容易就找到MySQL的配套使用教程,你可以不用付任何费用就能在自己的环境中部署起来对外承载业务。
|
7天前
|
存储 分布式计算 关系型数据库
|
1月前
|
存储 算法 关系型数据库
【MySQL的CheckPoint技术】
【MySQL的CheckPoint技术】
|
2月前
|
存储 关系型数据库 MySQL
带你读《2022技术人的百宝黑皮书》——mysql锁机制的再研究(1)
带你读《2022技术人的百宝黑皮书》——mysql锁机制的再研究(1)
|
2月前
|
存储 关系型数据库 MySQL
带你读《2022技术人的百宝黑皮书》——mysql锁机制的再研究(2)
带你读《2022技术人的百宝黑皮书》——mysql锁机制的再研究(2)
|
2月前
|
关系型数据库 MySQL 索引
带你读《2022技术人的百宝黑皮书》——mysql锁机制的再研究(3)
带你读《2022技术人的百宝黑皮书》——mysql锁机制的再研究(3)
|
2月前
|
关系型数据库 MySQL 索引
带你读《2022技术人的百宝黑皮书》——mysql锁机制的再研究(4)
带你读《2022技术人的百宝黑皮书》——mysql锁机制的再研究(4)
|
2月前
|
分布式计算 算法 关系型数据库
带你读《2022技术人的百宝黑皮书》——mysql锁机制的再研究(6)
带你读《2022技术人的百宝黑皮书》——mysql锁机制的再研究(6)
热门文章
最新文章
推荐文章
更多