InnoDB中的锁-意向锁

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL InnoDB 锁 意向锁

锁列表

  • 共享与列排他锁
  • 意向锁
  • 记录锁
  • 间隙锁
  • Next-Key锁
  • 插入意向锁
  • AUTO-INC锁

这次我们只来讨论和实验意向锁。

意向锁

InnoDB意向锁是为了支持多粒度锁共存而设计的,意向锁是一种特殊的行锁。在取得行锁之前需要先获取表的意向锁。
意向锁分为两类:意向共享锁和意向排他锁:

  • 意向共享锁IS:表示事务想要对表中的行设置共享锁。
  • 意向排他锁IX:表示事务想要对表中行设置排他锁。

意向锁主要是辅助表级和行级锁冲突的判断,因为InnoDB支持行级锁,如果没有意向锁,那么判断表级锁和行级锁冲突就需要遍历所有行的行锁,有了意向锁就可以直接判断意向锁是否存在就可以判断是否有行锁了。

意向锁兼容性

1.png

实验

X与IX冲突

事务A:先将表中的行设置一个IX锁,事务不提交

begin;
select * from sys_user where id=17 for update;

事务B:然后执行SQL

begin;
update sys_user set name_pinyin='wangwu1' where id=17;

事务B回滚:

MySQL [employees]> update sys_user set name_pinyin='wangwu1' where id=17;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
MySQL [employees]> 

show engine innodb status输出:

---TRANSACTION 126451825, ACTIVE 40 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 2 lock struct(s), heap size 1136, 1 row lock(s)
MySQL thread id 93, OS thread handle 139734682273536, query id 94962 192.168.1.83 root updating
update sys_user set name_pinyin='wangwu1' where id=17
------- TRX HAS BEEN WAITING 40 SEC FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 484 page no 7 n bits 328 index PRIMARY of table `employees`.`sys_user` trx id 126451825 lock_mode X locks rec but not gap waiting
Record lock, heap no 257
------------------

X与IS冲突

事务A:先将表中的行设置一个IS锁,事务不提交

begin;
select * from sys_user where id=17 for share;

事务B:然后执行SQL

begin;
update sys_user set name_pinyin='wangwu1' where id=17;

事务B回滚:

MySQL [employees]> update sys_user set name_pinyin='wangwu1' where id=17;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

锁情况:

IS与IX冲突

事务A:先对记录增加了一个IS锁

begin;
select * from sys_user where id=17 for share;

事务B:后对记录申请一个IX锁

begin;
select * from sys_user where id=17 for update;

事务B回滚:

MySQL [employees]> select * from sys_user where id=17 for update;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

注意

以上都是基于行进行的实验,具体的冲突矩阵大家可以使用以下SQL自行测试:

lock tables sys_user write;
lock tables sys_user read;

参考

  1. https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html#innodb-intention-locks
  2. https://www.infoq.cn/article/zau0ewzsdtx9zofr6c8w
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
存储 人工智能 关系型数据库
10个行锁、死锁案例⭐️24张加锁分析图🚀彻底搞懂Innodb行锁加锁规则!
10个行锁、死锁案例⭐️24张加锁分析图🚀彻底搞懂Innodb行锁加锁规则!
|
1月前
|
存储 SQL 关系型数据库
【MySQL技术内幕】6.3-InnoDB中的锁
【MySQL技术内幕】6.3-InnoDB中的锁
154 57
|
2月前
|
存储 算法 关系型数据库
介绍下InnoDB的锁机制?
InnoDB存储引擎的锁分为共享锁(S锁,读锁)和排他锁(X锁,写锁)。共享锁允许多个事务并发读取数据,不允许修改;排他锁允许读取和修改数据,阻止其他事务加锁。SELECT ... LOCK IN SHARE MODE和SELECT ... FOR UPDATE分别用于获取共享锁和排他锁。此外,还有意向锁(IX,IS)用于协调行级锁和表级锁的并发问题,意向锁在事务请求锁时自动获取。记录锁锁定索引记录,插入记录锁用于插入操作前的间隙锁定,而AUTO-INC锁确保自增列的有序性。
|
2月前
|
存储 SQL 算法
Innodb锁机制:Next-Key Lock 浅谈
Innodb锁机制:Next-Key Lock 浅谈
65 0
|
2月前
|
存储 算法 关系型数据库
MySQL相关(八)- innodb行级锁深入剖析
MySQL相关(八)- innodb行级锁深入剖析
81 0
|
2月前
|
存储 算法 关系型数据库
MySQL相关(七)- innodb 锁的介绍及使用
MySQL相关(七)- innodb 锁的介绍及使用
39 0
|
10月前
|
存储 监控 关系型数据库
InnoDB中的各种锁及其应用
InnoDB中的各种锁及其应用
|
关系型数据库
InnoDB行级锁的分析
在主键上的查询 下面做过实验
|
存储 关系型数据库 数据库
|
存储 关系型数据库 MySQL
InnoDB的锁机制是什么?底层原理是什么?
InnoDB的锁机制是什么?底层原理是什么?
119 0