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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 带你读《2022技术人的百宝黑皮书》——mysql锁机制的再研究(2)

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

image.png行锁

InnoDB支持行级别锁, 锁粒度小并发度高,但是加锁开销大也很可能会出现死锁innodb行锁住的是索引项,注意当回表时,主键的聚簇索引也会加上锁。

举个栗子:

 

 INSERT INTO `test_lock` (`id`,`gmt_create`,`gmt_modified`,`lock_key`,`lock_context`,`lock_biz`) VALUES (1,now(),now(),'123456',null,'AccountUser');

 

 

当执行下面语句, 因为查询字段多余组合索引覆盖字段, 会出现回表操作补齐其他字段, 此时唯一索引lock_key=123423-lock_biz=AccountUsery以及主键索引 id=1,均被锁住。

 

1 select * from test_lock where lock_key='123456' and lock_biz='AccountUser' for update;

 

加锁方式:

  1. 普通 select… 查询 (不加锁)
  2. 普通 insert、update、delete… (隐式加写锁)
  3. select…lock in share mode (加读锁)
  4. select…for update (加写锁)

 

解锁:

提交/回滚事物(commit/rollback) kill 阻塞进程

由于行锁用的最多且更容易出现死锁问题,下面会详细讲述行锁。

 

锁的模式分类

 

我们常规理解的锁分为2大类:读锁(也叫共享锁,S)和写锁(也叫排他锁,X)。

 

这两把锁之间的兼容性说明如下表

 

横轴表示已持有的锁,纵轴表示尝试获取的锁。1表示成功(即兼容,表现为正常进行下一步操作),0表示失败

(即冲突,表现为阻塞住当前操作)

 

 

兼容性

X

S

X

0

0

S

0

1

 

 

总结一句话就是:排他锁和任何锁均不兼容。

 

如果仅有读写锁,会存在一个性能问题,思考下面这个场景,其中T代表事务,T1代表事务1,以此类推。T1: 锁住表中的一行,只能读不能写(行级读锁)。

T2:申请整个表的写锁(表级写锁)。

 

 

 

如果T2申请成功,则能任意修改表中的一行,但这与T1持有的行锁是冲突的。故数据库应识别这种冲突,让T2的申请锁被阻塞,直到T1释放行锁。

若自己实现,最容易想到的识别方案就是遍历: step1:判断表是否已被其他事物用表锁锁住。step2: 判断表中的每一行是否已被行锁锁住。

其中step2需要遍历整个表,效率在数据库是没法接收的。因此innodb使用意向锁来解决这个问题

 

Innodb实现方案:                                                                                   T1需要先申请表的意向共享锁IS(注意意向共享锁为表级锁,且是由存储引擎自己维护,无需用户命手工命令干预),成功后再申请一行的行锁S。

在意向锁存在的情况下,上面的判断可以改为:step1:                            不变 step2:发现表上有意向共享锁,说明表中行被共享行锁锁住了,因此,事务B申请表的写锁被阻塞。

 

此时就引入的意向锁,加入意向锁后,锁的兼容性分析如下表:

横轴表示已持有的锁,纵轴表示尝试获取的锁。1表示成功(即兼容,表现为正常进行下一步操作),0表示失败

(即冲突,表现为阻塞住当前操作)

 

 

兼容性

IX

IS

X

S

IX

1

1

0

0

IS

1

1

0

1

X

0

0

0

0

S

0

1

0

1

 

 

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

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7天前
|
SQL 关系型数据库 MySQL
MySQL数据库进阶第五篇(锁)
MySQL数据库进阶第五篇(锁)
|
2天前
|
存储 关系型数据库 MySQL
深入浅出MySQL事务管理与锁机制
MySQL事务确保数据一致性,ACID特性包括原子性、一致性、隔离性和持久性。InnoDB引擎支持行锁、间隙锁和临键锁,提供四种隔离级别。通过示例展示了如何开启事务、设置隔离级别以及避免死锁。理解这些机制对优化并发性能和避免数据异常至关重要。【6月更文挑战第22天】
80 3
|
12天前
|
存储 SQL 关系型数据库
【MySQL技术内幕】6.5-锁问题、阻塞、死锁、锁升级
【MySQL技术内幕】6.5-锁问题、阻塞、死锁、锁升级
37 2
|
4天前
|
SQL NoSQL 关系型数据库
Mysql锁及适用场景
Mysql锁及适用场景
11 0
|
10天前
|
SQL 监控 关系型数据库
深入理解MySQL:核心技术与实战应用
第一章:MySQL概述 1.1 MySQL简介 简要介绍MySQL的起源、发展历程和它在现代数据库领域中的位置
|
10天前
|
监控 安全 关系型数据库
精通MySQL:数据库核心技术与应用实践
h3> 一、引言 MySQL作为开源关系型数据库管理系统的佼佼者,凭借其出色的性能、灵活性和稳定性,成为许多企业和开发者的首选
|
2天前
|
存储 关系型数据库 MySQL
关系型数据库MySQL的MyISAM
【6月更文挑战第17天】
19 11
|
1天前
|
SQL 关系型数据库 MySQL
关系型数据库mysql的CSV
【6月更文挑战第18天】
18 6
|
3天前
|
存储 关系型数据库 MySQL
|
3天前
|
SQL 关系型数据库 MySQL