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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 带你读《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

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
20天前
|
存储 关系型数据库 MySQL
MySQL MVCC全面解读:掌握并发控制的核心机制
【10月更文挑战第15天】 在数据库管理系统中,MySQL的InnoDB存储引擎采用了一种称为MVCC(Multi-Version Concurrency Control,多版本并发控制)的技术来处理事务的并发访问。MVCC不仅提高了数据库的并发性能,还保证了事务的隔离性。本文将深入探讨MySQL中的MVCC机制,为你在面试中遇到的相关问题提供全面的解答。
56 2
|
29天前
|
缓存 关系型数据库 MySQL
MySQL并发支撑底层Buffer Pool机制详解
【10月更文挑战第18天】在数据库系统中,磁盘IO操作是性能瓶颈之一。为了提高数据访问速度,减少磁盘IO,MySQL引入了缓存机制。其中,Buffer Pool是InnoDB存储引擎中用于缓存磁盘上的数据页和索引页的内存区域。通过缓存频繁访问的数据和索引,Buffer Pool能够显著提高数据库的读写性能。
77 2
|
1月前
|
SQL 关系型数据库 MySQL
MySQL 锁
MySQL里常见的几种锁
52 3
|
7天前
|
监控 关系型数据库 MySQL
MySQL自增ID耗尽应对策略:技术解决方案全解析
在数据库管理中,MySQL的自增ID(AUTO_INCREMENT)属性为表中的每一行提供了一个唯一的标识符。然而,当自增ID达到其最大值时,如何处理这一情况成为了数据库管理员和开发者必须面对的问题。本文将探讨MySQL自增ID耗尽的原因、影响以及有效的应对策略。
25 3
|
26天前
|
存储 关系型数据库 MySQL
优化 MySQL 的锁机制以提高并发性能
【10月更文挑战第16天】优化 MySQL 锁机制需要综合考虑多个因素,根据具体的应用场景和需求进行针对性的调整。通过不断地优化和改进,可以提高数据库的并发性能,提升系统的整体效率。
49 1
|
1月前
|
XML 关系型数据库 MySQL
MySQL 导出某些数据的技术详解
MySQL 导出某些数据的技术详解
127 2
|
1月前
|
关系型数据库 MySQL Java
MySQL数据锁:Record Lock,Gap Lock 和 Next-Key Lock
本文基于 MySQL 8.0.30 版本及 InnoDB 引擎,深入解析三种行锁机制:记录锁(Record Lock)、间隙锁(Gap Lock)和临键锁(Next-key Lock)。记录锁锁定索引记录,确保事务唯一修改;间隙锁锁定索引间的间隙,防止新记录插入;临键锁结合两者,锁定范围并记录自身,有效避免幻读现象。通过具体示例展示了不同锁的作用机制及其在并发控制中的应用。
107 2
|
1月前
|
存储 关系型数据库 MySQL
MySQL数据库锁:共享锁和独占锁
本文详细介绍了`InnoDB`存储引擎中的两种行级别锁:共享锁(S锁)与排他锁(X锁)。通过具体示例展示了这两种锁的工作机制及其在`InnoDB`与`MyISAM`引擎中的表现差异。文章还提供了锁的兼容性矩阵,帮助读者更好地理解锁之间的互斥关系。最后总结了两种锁的特点及适用场景。适合希望深入了解`MySQL`并发控制机制的读者阅读。
41 1
|
26天前
|
存储 关系型数据库 MySQL
MySQL锁,锁的到底是什么?
【10月更文挑战第16天】MySQL 锁锁定的是与数据和资源相关的对象,其目的是为了保证数据的一致性、避免冲突,并在并发环境下合理协调事务或操作的执行。理解锁的对象和意义对于优化数据库性能、处理并发问题至关重要。
54 0
|
29天前
|
关系型数据库 MySQL 数据库
mysql锁详解
通过理解并合理运用MySQL中的锁机制,开发者可以有效管理数据库并发访问,平衡性能与数据一致性需求。更多关于MySQL锁的深入探讨和最佳实践,请参考专业的数据库管理资源[[深入MySQL锁机制详解
32 0