InnoDB中的锁-意向锁

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
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
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
存储 人工智能 关系型数据库
10个行锁、死锁案例⭐️24张加锁分析图🚀彻底搞懂Innodb行锁加锁规则!
10个行锁、死锁案例⭐️24张加锁分析图🚀彻底搞懂Innodb行锁加锁规则!
|
存储 SQL 关系型数据库
【MySQL技术内幕】6.3-InnoDB中的锁
【MySQL技术内幕】6.3-InnoDB中的锁
303 57
|
监控 关系型数据库 MySQL
在Linux中,mysql的innodb如何定位锁问题?
在Linux中,mysql的innodb如何定位锁问题?
|
SQL 存储 关系型数据库
"MySQL增列必锁表?揭秘InnoDB在线DDL,让你的数据库操作飞一般,性能无忧!"
【8月更文挑战第11天】在数据库领域,MySQL凭借其稳定高效的表现深受开发者喜爱。对于是否会在给数据表添加列时锁表的问题,MySQL的行为受版本、存储引擎等因素影响。从5.6版起,InnoDB支持在线DDL,可在改动表结构时保持表的可访问性,避免长时间锁表。而MyISAM等则需锁表完成操作。例如,在使用InnoDB的表上运行`ALTER TABLE users ADD COLUMN email VARCHAR(255);`时,通常不会完全锁表。虽然在线DDL提高了灵活性,但复杂操作或大表变更仍可能暂时影响性能。因此,进行结构变更前应评估其影响并择机执行。
240 6
|
SQL 关系型数据库 BI
关于InnoDB行锁和4种锁是怎么实现的?
总的来说,InnoDB的行锁机制通过索引来实现对数据行的精确控制,并通过多种锁类型和兼容性规则来处理并发事务中的冲突。开发者需要注意合理使用索引和优化事务处理,以提高数据库的并发性能和稳定性。
185 1
|
存储 SQL 算法
Innodb锁机制:Next-Key Lock 浅谈
Innodb锁机制:Next-Key Lock 浅谈
390 0
|
存储 算法 关系型数据库
MySQL相关(八)- innodb行级锁深入剖析
MySQL相关(八)- innodb行级锁深入剖析
233 0
|
存储 算法 关系型数据库
MySQL相关(七)- innodb 锁的介绍及使用
MySQL相关(七)- innodb 锁的介绍及使用
113 0
|
存储 监控 关系型数据库
InnoDB中的各种锁及其应用
InnoDB中的各种锁及其应用
|
关系型数据库
InnoDB行级锁的分析
在主键上的查询 下面做过实验
102 0