MYSQL-锁
锁
全局锁
flush tables with read lock;
mysqldump -uroot -p1234 itcast>itcast.sql
(换成自己的用户名与密码)
unlock tables;
特点
数据库中加全局锁,是一一个比较重的操作,存在以下问题:
- 如果在主库上备份,那么在备份期间都不能执行更新,业务基本.上就得停摆。
- 如果在从库 上备份,那么在备份期间从库不能执行主库同步过来的二进制日志(binlog) ,会导致主从延迟。
在InnoDB引擎中,我们可以在备份时加上参数–single-transaction参数来完成不加锁的-致性数据备份。
mysqldump --single-transaction -uroot -p123456 itcast>itcast.sql
--single-transaction 在事务开启的瞬间,InnoDB 会为该事务分配一个事务 ID,这个事务 ID 代表了一个特定的时间点,备份操作将基于这个时间点来获取数据。
表级锁
表锁
读锁read lock:当前客户端可以读写,其他客户端只能读不能写(会阻塞)。
写锁write lock:当前客户端可以读写,其他客户端不能读不能写。
加锁: lock tables表名…read/write。
释放锁: unlock tables / 客户端断开连接。
元数据锁( meta data lock,MDL)
在MySQL5.5中引入了MDL,当对一张表 进行增删改查的时候,加MDL读锁(共享);当对表结构进行变更操作的时候,加MDL写锁(排他)。
对应SQL | 锁类型 | 说明 |
---|---|---|
lock tables xxx read / write | SHARED_READ_ONLY / SHARED NO_READ_WRITE | |
select、select … lock in share mode | SHARED_READ(共享读锁) | 与SHARED_READ、SHARED WRITE兼容,与EXCLUSIVE互斥 |
insert、update、 delete、 select … for update | SHARED_WRITE | 与SHARED_READ、SHARED_WRITE兼容 ,与EXCLUSIVE互斥 |
alter table … | EXCLUSIVE(排他锁) | 与其他的MDL都互斥 |
alter table 的操作自动加上exclude lock排他锁,与读锁read lock、写锁write lock互斥,当有select(read lock)、update(write lock)等加入了读、写锁时,进行alter table操作会阻塞。
意向锁
为了避免DML在执行时,加的行锁与表锁的冲突,在InnoDB中引入了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查。
解释:当有操作加了行锁时,此时又有加表锁的操作,会先扫描整个表看有没有其他兼容的锁,不兼容则等待释放,可以在加行锁时加一个意向锁,这样,每次加表锁时先检查意向锁是否存在,兼容,不用扫描整个表。
- 意向共享锁(IS):由语句select … lock in share mode添加。
- 意向排他锁 (IX):由insert、 update、delete、 select … for update添加。
行级锁
行级锁,每次操作锁住对应的行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高。应用在InnoDB存储引擎中。
InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁。对于行级锁,主要分为以下三类:
-
行锁(Record Lock) :锁定单个行记录的锁,防止其他事务对此行进行update和delete。在RC、RR隔离级别下都支持。
SQL 行锁类型 说明 INSERT … 排他锁 自动加锁 UPDATE … 排他锁 自动加锁 DELETE … 排他锁 自动加锁 select操作是共享锁,此时只有设置共享锁的语句可以兼容,而其他INSERT等操作为排它锁,所有操作都不能执行
- 针对唯一索引进行检索时,对已存在的记录进行等值匹配时,将会自动优化为行锁。
- InnoDB的行锁是针对于索引加的锁,不通过索引条件检索数据(检索的列没有加索引),那么InnoDB将对表中的所有记录加锁,此时就会升级为表锁。
-
间隙锁(Gap Lock) :锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事务在这个间隙进行insert,产生幻读。在RR隔离级别下都支持。
-
临键锁(Next-Key Lock) :行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙Gap。在RR隔离级别下支持。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下