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

简介: 带你读《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

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
7月前
|
SQL AliSQL 关系型数据库
MYSQL的全局锁和表锁
本文介绍了MySQL中的锁机制,包括全局锁、表级锁及其应用场景。全局锁通过`Flush tables with read lock (FTWRL)`实现,主要用于全库逻辑备份,但会阻塞更新和结构变更操作。表级锁分为显式表锁(`lock tables`)和元数据锁(MDL),前者用于控制并发访问,后者自动加锁以确保读写正确性。文章还探讨了如何安全地为小表添加字段,建议通过设置DDL等待时间或使用MariaDB/AliSQL的NOWAIT/WAIT功能避免业务阻塞。这些方法有助于在高并发场景下优化数据库性能与安全性。
192 0
|
5月前
|
缓存 关系型数据库 MySQL
在MySQL中处理高并发和负载峰值的关键技术与策略
采用上述策略和技术时,每个环节都要进行细致的规划和测试,确保数据库系统既能满足高并发的要求,又要保持足够的灵活性来应对各种突发的流量峰值。实施时,合理评估和测试改动对系统性能的影响,避免单一措施可能引起的连锁反应。持续的系统监控和分析将对维护系统稳定性和进行未来规划提供重要信息。
303 15
|
存储 关系型数据库 MySQL
MySQL MVCC全面解读:掌握并发控制的核心机制
【10月更文挑战第15天】 在数据库管理系统中,MySQL的InnoDB存储引擎采用了一种称为MVCC(Multi-Version Concurrency Control,多版本并发控制)的技术来处理事务的并发访问。MVCC不仅提高了数据库的并发性能,还保证了事务的隔离性。本文将深入探讨MySQL中的MVCC机制,为你在面试中遇到的相关问题提供全面的解答。
909 2
|
10月前
|
关系型数据库 MySQL 网络安全
如何排查和解决PHP连接数据库MYSQL失败写锁的问题
通过本文的介绍,您可以系统地了解如何排查和解决PHP连接MySQL数据库失败及写锁问题。通过检查配置、确保服务启动、调整防火墙设置和用户权限,以及识别和解决长时间运行的事务和死锁问题,可以有效地保障应用的稳定运行。
410 25
|
11月前
|
存储 关系型数据库 MySQL
MySQL进阶突击系列(06)MySQL有几种锁?| 别背答案,现场演示一下
本文详细解析了MySQL InnoDB存储引擎的锁机制,涵盖读锁、写锁、意向锁、记录锁、间隙锁和临键锁等8种锁类型。重点探讨了不同锁类型的加锁与释放方式,以及事务并发场景下的实战验证。通过具体示例,展示了在不同情况下锁的行为及其对事务的影响。文章还特别强调了锁的作用范围主要是索引,并解释了锁如何影响数据的读写操作。最后总结了并发事务中加锁规则,帮助读者深入理解MySQL的锁机制。
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
522 1
|
监控 前端开发 Java
【技术开发】接口管理平台要用什么技术栈?推荐:Java+Vue3+Docker+MySQL
该文档介绍了基于Java后端和Vue3前端构建的管理系统的技术栈及功能模块,涵盖管理后台的访问、登录、首页概览、API接口管理、接口权限设置、接口监控、计费管理、账号管理、应用管理、数据库配置、站点配置及管理员个人设置等内容,并提供了访问地址及操作指南。
|
监控 关系型数据库 MySQL
MySQL自增ID耗尽应对策略:技术解决方案全解析
在数据库管理中,MySQL的自增ID(AUTO_INCREMENT)属性为表中的每一行提供了一个唯一的标识符。然而,当自增ID达到其最大值时,如何处理这一情况成为了数据库管理员和开发者必须面对的问题。本文将探讨MySQL自增ID耗尽的原因、影响以及有效的应对策略。
590 3
|
存储 关系型数据库 MySQL
优化 MySQL 的锁机制以提高并发性能
【10月更文挑战第16天】优化 MySQL 锁机制需要综合考虑多个因素,根据具体的应用场景和需求进行针对性的调整。通过不断地优化和改进,可以提高数据库的并发性能,提升系统的整体效率。
724 1

推荐镜像

更多