MYSQL-锁

全局锁

flush tables with read lock;

mysqldump -uroot -p1234 itcast>itcast.sql(换成自己的用户名与密码)

unlock tables;

特点
数据库中加全局锁,是一一个比较重的操作,存在以下问题:

  1. 如果在主库上备份,那么在备份期间都不能执行更新,业务基本.上就得停摆。
  2. 如果在从库 上备份,那么在备份期间从库不能执行主库同步过来的二进制日志(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中引入了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查

解释:当有操作加了行锁时,此时又有加表锁的操作,会先扫描整个表看有没有其他兼容的锁,不兼容则等待释放,可以在加行锁时加一个意向锁,这样,每次加表锁时先检查意向锁是否存在,兼容,不用扫描整个表。

  1. 意向共享锁(IS):由语句select … lock in share mode添加。
  2. 意向排他锁 (IX):由insert、 update、delete、 select … for update添加。

行级锁

行级锁,每次操作锁住对应的行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高。应用在InnoDB存储引擎中。

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

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

    SQL 行锁类型 说明
    INSERT … 排他锁 自动加锁
    UPDATE … 排他锁 自动加锁
    DELETE … 排他锁 自动加锁

    select操作是共享锁,此时只有设置共享锁的语句可以兼容,而其他INSERT等操作为排它锁,所有操作都不能执行

    1. 针对唯一索引进行检索时,对已存在的记录进行等值匹配时,将会自动优化为行锁。
    2. InnoDB的行锁是针对于索引加的锁,不通过索引条件检索数据(检索的列没有加索引),那么InnoDB将对表中的所有记录加锁,此时就会升级为表锁
  2. 间隙锁(Gap Lock) :锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事务在这个间隙进行insert,产生幻读。在RR隔离级别下都支持。
    在这里插入图片描述

  3. 临键锁(Next-Key Lock) :行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙Gap。在RR隔离级别下支持。
    在这里插入图片描述

posted @   hongfeiliu  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示