MySQL 锁机制

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL 锁机制


MySQL 锁机制

表锁

读锁

查看哪些表被加锁了

语法:show open tables

添加读锁

read 读锁关键字 | write 写锁关键字

语法:lock table 表名 read

解锁

语法:unlock table

场景一

当查询一加了读锁后,查询一无法进行查询其它表

-- 给student添加读锁
lock table student read
-- 当我们再去查询user表时,直接报错
select * from user

场景二

当我们去修改时,也会报错,因为加的是读锁

update student set StudentName = '小花3' where Id = 1

场景三

查询二(新建查询)中可以去查询其它表,但是修改当前表会进入阻塞状态(一直进行查询,指到解锁之后)

update student set StudentName = 'XXX5' where Id = 1

总结

加了表锁之后,查询1无法进行查询其它表(相当于这次借的钱没还,下次又来借钱,肯定是不借),查询1不能修改当前已经被锁表和其它表,会导致报错,除非解锁后回复正常操作

在查询1加了表锁之后,查询2可以查询其它表,但不能修改其它表和当前已经锁的表,修改当前锁的表会导致一直阻塞,除非解锁后回复正常操作

写锁

场景一
--给student添加写锁
lock table student write;

查询一:可以查询当前student,但是不能查询其它表(user…)

场景二

查询一:可以修改当前表,不能修改其它表

update student set StudentName = 'XXX2' where Id = 1
场景三

查询二:不可以查询当前student,可以查询其它表(user…)

select * from student

总结

查询一添加写锁后,查询一:可以查询当前student,但是不能查询其它表(user…),查询一:可以修改当前表,不能修改其它表,查询二:不可以查询当前student,可以查询其它表(user…)

行锁

场景一

查询一和查询二分别设置关闭自动提交

语法:set autocommit = 0;

设置(打开)自动提交

语法:set autocommit = 1;

当查询一修改完数据后,查询二中无法进行查看

查询二:执行完commit后

查询一:执行完commit后,再次查询既可看到更新后的数据

场景二

当查询二修改数据后,未进行commit时,查询一不能修改当前查询二修改的那台未进行commit时的数据,否则导致阻塞,只能等待

只要当查询二commit后,查询一才能看到更改后的数据

总结

当双方同时修改同一行数据时,修改完后必须要进行手动提交commit,对方才可以看到你修改的数据,否则你修改完后,别人是看不到的,别人也无法修改当前这条数据,否则就会出现阻塞

间隙锁

间隙锁

当我们用范围条件检索数据,并请求共享或排他锁时,InnODB会给符合条件的已有数据记录的索引项加锁:对于键值在条件范围内但并不存在的记录

这种锁机制就是所谓的间隙锁(Next-Key锁)

缺点

当锁定一个范用键值之后,即使某些不存在的键值也会被无辜的锁定,而造成在锁定的时候无法插入锁定键值范围内的任何数据。在某些场景下这可能会对性能造成很大的危害(造成间隙锁后,锁定键值范围内的数据无法插入和修改)

如何锁定一行

当前查询一窗口的某行数据被锁定时,查询二窗口无法进行修改数据,当查询一修改完提交后,查询二可以修改

语法:selectfrom test_innodb_lock where a=8 for update

只需加上 for update 关键字即可

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
关系型数据库 MySQL 数据库
MySQL的行级锁锁的到底是什么?
本文简述了InnoDB的行级锁机制,包括记录锁、间隙锁和Next-Key锁。记录锁锁定索引记录,防止其他事务对相同值的行进行操作;间隙锁锁定索引记录间的间隙,防止插入。Next-Key锁是两者的结合,锁定记录及其前后间隙。在可重复读(RR)隔离级别下,加锁策略涉及Next-Key锁,但会因查询条件退化为行锁或间隙锁。MySQL的加锁机制遵循两个原则和两个优化,例如唯一索引等值查询时退化为行锁。RR级别虽能防止幻读,但也可能降低并发并引发死锁,因此有些场景下会选择读已提交(RC)级别。
MySQL的行级锁锁的到底是什么?
|
1天前
|
存储 SQL 关系型数据库
【MySQL技术内幕】6.5-锁问题、阻塞、死锁、锁升级
【MySQL技术内幕】6.5-锁问题、阻塞、死锁、锁升级
18 2
|
1天前
|
SQL 存储 算法
【MySQL技术内幕】6.4-锁的算法
【MySQL技术内幕】6.4-锁的算法
16 1
|
1天前
|
存储 SQL 关系型数据库
【MySQL技术内幕】6.3-InnoDB中的锁
【MySQL技术内幕】6.3-InnoDB中的锁
136 57
|
1天前
|
存储 SQL 关系型数据库
【MySQL技术内幕】6.1-锁、lock和latch
【MySQL技术内幕】6.1-锁、lock和latch
10 0
|
1天前
|
存储 关系型数据库 MySQL
【MySQL技术内幕】4.5-Named File Formats机制
【MySQL技术内幕】4.5-Named File Formats机制
9 2
|
2天前
|
存储 关系型数据库 MySQL
深入研究MySQL意向锁
MySQL意向锁是一种特殊的表级锁,由InnoDB存储引擎在操作数据之前自动添加,无需用户干预。它分为意向共享锁(IS)和意向排他锁(IX)两种。意向锁的主要作用是协调行锁和表锁的关系,优化加锁策略,避免全表扫描判断是否存在行锁。意向锁之间不会冲突,但会与表级别的排他锁冲突,从而确保数据库并发访问的一致性和完整性。简而言之,意向锁提高了数据库并发操作的性能和效率。
|
2天前
|
存储 SQL 关系型数据库
MYSQL--锁机制*
MYSQL--锁机制*
|
2天前
|
SQL 关系型数据库 MySQL
【MySQL】事务?隔离级别?锁?详解MySQL并发控制机制
【MySQL】事务?隔离级别?锁?详解MySQL并发控制机制
12 0
|
8天前
|
SQL 关系型数据库 MySQL
MySQL数据库——锁-行级锁(行锁、间隙锁和临键锁)
MySQL数据库——锁-行级锁(行锁、间隙锁和临键锁)
13 0