当前位置: 首页 > article >正文

MySQL--锁

锁是mysql在并发访问时,解决数据访问一致性、有效性的一种机制

mysq中的锁,按照锁的粒度分,分为以下三类:
全局锁:锁定数据库中的所有表
表级锁:每次操作锁住整张表
行级锁:每次操作锁住对应的行数据

全局锁

全局锁是对整个数据库实例加锁,加锁后整个实例处于只读状态。

使用场景

做全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性

备份数据(windwos命令)

mysqldump -hlocalhost -uroot -p123 数据建库名 >D:/文件名.sql

加锁(sql命令)

flush tables with read lock;

释放锁

unlocak tables;

特点

  1. 如果在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆。
  2. 如果在从库上备份,那么在备份期间从库不能执行主库同步过来的二进制日志,会导致主从延迟。

表级锁

表锁
表锁分为两类:

  1. 表共享读锁(read lock)
  2. 表独占写锁(write lock)

语法

  1. 加锁:lock tables 表名 … read/wirte

  2. 释放锁:unlock tables /客户端断开连接

读锁不会阻塞其他客户端的读,但会阻塞写。写锁即会阻塞其他客户端的读,也会阻塞写。

元数据锁
MDL加锁过程是系统自动控制,无需显示使用,在访问一张表的时候会自动加上。MDL锁主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元素数据进行写入操作。为了避免DML和DDL冲突,保证读写的正确性。

在mysq5.5中引入了MDL,当对一张表进行增删改查的时候,加MDL读锁(共享);当对表结构进行变更操作的时候,加MDL写锁(排他)。

对应SQL锁类型说明
lock tables xxx read /writeshared_read_only / shared_no_read_write
select、select…lock in share modeshared_read与shared_read、shared_write兼容,与exclusive互斥
insert、update、delete、select…for updateshared_write与shared_read、shared_write兼容,与exclusive互斥
alter table…exclusive与其他的MDL都互斥

意向锁
为了避免DML在执行时,加的行锁与表锁的冲突,在InnoDB中引入了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查。
意向锁分为

  1. 意向共享锁(IS):与表锁共享锁(read)兼容,与表锁排他锁(write)互斥。
  2. 意向排他锁(IX):与表锁共享锁(read)及排它锁(write)都互斥。意向锁之间不会互斥。

可以通过查询下表获取事务中的锁

select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;

行级锁

每次操作锁住对应的行数。锁定力度最小,并发最大。
行锁
InnoDB实现了一下两种类型的行锁:

  1. 共享锁(S):允许一个事务去读一行,其他事务获得相同数据集的排他锁。
  2. 排他锁(X):允许获取排他锁的事务更新数据,组织其他事务获得相同数据集的共享锁和排他锁。
SQL行锁类型说明
insert排他锁自动加锁
update排他锁自动加锁
delete排他锁自动加锁
select不加任何锁
select … lock in share mode共享锁手动添加
select … for update排他锁手动添加
  1. 针对唯一索引进行检查时,对已存在的记录进行等值匹配时,将会自动优化为行锁。
  2. InnoDB的行锁是针对于索引加的锁,不通过索引条件检索数据,那么InnoDB将对表中的所有记录加锁,此时会升级会表锁

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

  1. 索引上的等值查询(唯一索引),给不存在的记录加锁时,优化为间隙锁
  2. 索引上的等值查询(普通索引),向右遍历时最后一个值不满足查询需求时,next-key lock 退化为间隙锁
  3. 索引上的范围查询(唯一索引)会访问到不满足条件的第一个值为止

间隙锁的唯一目的是防止其他事务插入间隙。间隙锁可以共存,一个事务采用的间隙锁不会阻止另一个事务在同一间隙上采用间隙锁。


http://www.kler.cn/a/146620.html

相关文章:

  • TCP 连接状态标识 | SYN, FIN, ACK, PSH, RST, URG
  • 使用Flink-JDBC将数据同步到Doris
  • 【Rust练习】28.use and pub
  • 【AIGC】SYNCAMMASTER:多视角多像机的视频生成
  • Mac玩Steam游戏秘籍!
  • nexus搭建maven私服
  • NSGA-II求解微电网多目标优化调度(MATLAB)
  • 鼠标拖拽问题,不选中文本不触发单击事件
  • linux 搭建Nginx网页(编译安装)
  • OJ练习第186题——统计子串中的唯一字符
  • Python 进阶(十一):高精度计算(decimal 模块)
  • FTP服务器搭建
  • springBoot常见的问题
  • C++const指针的两种用法
  • 【SpringBoot3+Vue3】五【完】【实战篇】-前端(配合后端)
  • 学习课题:逐步构建开发播放器【QT5 + FFmpeg6 + SDL2】
  • springboot函数式web
  • 亚马逊云科技re:Invent大会:云计算与生成式AI共筑科技新局面,携手构建未来
  • ubuntu 安装 jetbrains-toolbox
  • 微服务保护 Sentinel
  • 知行之桥EDI系统HTTP签名验证
  • 自定义右键菜单栏
  • 使用Java连接Hbase
  • QT网络协议知识体系(一)
  • C++ 协程
  • C++ 常见异常