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
目录
相关文章
|
11天前
|
关系型数据库 MySQL 数据库
【MySQL实战笔记】 06 | 全局锁和表锁 :给表加个字段怎么有这么多阻碍?-01
【4月更文挑战第17天】MySQL的锁分为全局锁、表级锁和行锁。全局锁用于全库备份,可能导致业务暂停或主从延迟。不加锁备份会导致逻辑不一致。推荐使用`FTWRL`而非`readonly=true`因后者可能影响其他逻辑且异常处理不同。表级锁如`lock tables`限制读写并限定操作对象,常用于并发控制。元数据锁(MDL)在访问表时自动加锁,确保读写正确性。
70 31
|
11天前
|
关系型数据库 MySQL 数据库
MySQL的行级锁锁的到底是什么?
本文简述了InnoDB的行级锁机制,包括记录锁、间隙锁和Next-Key锁。记录锁锁定索引记录,防止其他事务对相同值的行进行操作;间隙锁锁定索引记录间的间隙,防止插入。Next-Key锁是两者的结合,锁定记录及其前后间隙。在可重复读(RR)隔离级别下,加锁策略涉及Next-Key锁,但会因查询条件退化为行锁或间隙锁。MySQL的加锁机制遵循两个原则和两个优化,例如唯一索引等值查询时退化为行锁。RR级别虽能防止幻读,但也可能降低并发并引发死锁,因此有些场景下会选择读已提交(RC)级别。
MySQL的行级锁锁的到底是什么?
|
11天前
|
存储 算法 关系型数据库
MySQL事务与锁,看这一篇就够了!
MySQL事务与锁,看这一篇就够了!
|
11天前
|
存储 关系型数据库 MySQL
MySQL数据库锁定机制
MySQL数据库锁定机制
14 0
|
11天前
|
存储 关系型数据库 MySQL
MySQL的锁机制
MySQL的锁机制主要用于管理并发事务对数据的一致性和完整性的访问控制
27 4
|
11天前
|
存储 SQL 关系型数据库
|
11天前
|
关系型数据库 MySQL 数据库
MySQL锁解密:读锁与写锁
【4月更文挑战第20天】
26 1
|
11天前
|
关系型数据库 MySQL 数据库
|
11天前
|
算法 关系型数据库 MySQL
|
11天前
|
SQL 关系型数据库 MySQL
MySQL锁:解析隐式锁与显式锁
【4月更文挑战第20天】
44 0