MySQL的锁(行锁)

行级锁,每次操作锁住对应的行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高。

InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁。对于行级锁,主要分为以下三类:

  1. 行锁(Record Lock):锁定单个行记录的锁,防止其他事务对此行进行update和delete。在RC、RR隔离级别下都支持。

默认情况下,InnoDB在REPEATABLE READ事务隔离级别运行,InnoDB使用next-key锁进行搜索和索引扫描,以防止幻读。

  1. 针对唯一索引进行检索时,对已存在的记录进行等值匹配时,将会自动优化为行锁

在事务里使用select * from stu where id=1 lock in share mode;

会产生行锁和表的意向锁。

共享锁和共享锁兼容。

id为1的加了行锁之后,可以对id=3的进行更新操作

update stu set name='java' where id=3;

如果更新id=1的,就会处于阻塞状态。

  1. InnoDB的行锁是针对于索引加的锁,不通过索引条件检索数据,那么InnoDB将对表中的所有记录加锁,此时就会升级为表锁。

name字段没有索引的情况下,执行

begin;

update stu set name='php' where name='java';

在另外的事务中

begin;

update stu set name='spring' where name='tom'; 会被锁住,说明上面的执行升级为表锁了。

  1. 间隙锁(Gap Lock):锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事务在这个间隙进行insert,产生幻读。在RR隔离级别下都支持。

默认情况下,InnoDB在REPEATABLE READ事务隔离级别运行,InnoDB使用next-key锁进行搜索和索引扫描,以防止幻读。

(1)索引上的等值查询(唯一索引),给不存在的记录加锁时,优化为间隙锁。

在唯一索引上,更新一条不存在的记录

begin;

update stu set name='tomcat' where id=5;

这个时候,3和8之间(不包含3,8)就会被锁住GAP,

使用insert语句进行验证

begin;

insert into stu values(7, 'springboot', 7); 会一直堵塞在那里,直到左边的事务提交。

(2)索引上的等值查询(普通索引),向右遍历时最后一个值不满足查询需求时,next-key lock退化为间隙锁。

先在age上创建普通索引(非唯一索引)

create index idx_age on stu(age);

(3)索引上的范围查询(唯一索引),会访问到不满足条件的第一个值为止。

  1. 临键锁(next-key Lock):行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙Gap。在RR隔离级别下支持。

在并发访问时,解决数据访问的一致性、有效性问题。分全局锁、表级锁、行级锁。

全局锁是对整个数据库实例加锁,加锁后整个实例就处于只读状态,性能较差,数据逻辑备份时使用。

表级锁是操作锁住整张表,锁定粒度大,发生锁冲突的概率高,分为表锁、元数据锁,意向锁。

行级锁是操作锁住对应的行数据,锁定粒度最小,发生锁冲突的概率最低,分为行锁、间隙锁、临键锁。

相关推荐
倔强的石头_21 小时前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
jiayou642 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
于眠牧北2 天前
MySQL的锁类型,表锁,行锁,MVCC中所使用的临键锁
mysql
李广坤3 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
Turnip12024 天前
深度解析:为什么简单的数据库"写操作"会在 MySQL 中卡住?
后端·mysql
爱可生开源社区4 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1774 天前
《从零搭建NestJS项目》
数据库·typescript
加号35 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏5 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐5 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端