MySQL锁
分类
MySQL中的锁,按照锁的粒度分,分为以下三类:
- 全局锁:锁定数据库中的所有表。
- 表级锁:每次操作锁住整张表。
- 行级锁:每次操作锁住对应的行数据。
全局锁
全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句,DDL语句,已经更新操作的事务提交语句都
将被阻塞。
其典型的使用场景是做全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性。
flush tables with read lock; (加锁)
mysqldump-uroof-p1234 itcast > itcast.sql;( itcast是数据库,此处将数据库 itast备份到itcast. sql中)(这是提供的一个工具不要在mysql命令中执行此语句)
Unlock tables;(解锁)
特点
数据库中加全局锁,是一个比较重的操作,存在以下问题:
- 如果在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆。
- 如果在从库上备份,那么在备份期间从库不能执行主库同步过来的二进制日志 (binlog),会导致主从延迟。
在InoDB引擎中,我们可以在备份时加上参数--single-transaction 参数来完成不加锁的一致性数据备份。
mysaldump --single-transaction -uroot -p123456 itcast >itcast.sql (在inodb底层中采用的是快照读来实现的)
表级锁
表级锁,每次操作锁住整张表。锁定粒度大,发生锁冲突的概率最高,并发度最低。应用在MyISAM、InnODB、BDB等存储引擎中。
对于表级锁,主要分为以下三类:
1. 表锁
2.元数据锁 (meta data lock, MDL)
3.意向锁
一. 表级锁
1.表锁
2.元数据锁
5.5.3版本后每次Dml操作和DDI操作都会申请一个元数据锁,所有的Dml操作都加的是读锁(共享锁),所有的Ddl操作都加的写锁(排它锁)
看lock-type 是哪种锁
3.意向锁(表锁默认会检查每一行看是否加了行锁,并且查看行锁类型看是否冲突决定能否成功添加表锁,执行update等操作会添加行锁同时也添加了意向锁,表锁直接查看和意向锁是否冲突,决定表锁是否添加成功)
*select普通语句默认不会主动加行锁和意向锁,需要在select语句后添加lock in share mode或者for update,意向锁其实和行级索的锁类型是一样的
二.行级锁
*下面不通过索引条件检索数据意思就是没有对条件语句中的字段(列)添加索引,因为行锁锁的是索引并非数据
默认是临键锁。当为唯一索引时且查询的记录存在会优化成行锁,如果不存在会优化为间隙锁。如果是不走索引那么会升级为表锁(注:普通索引也是临键锁,当查找到最后一个不满足需求时会优化为间隙锁以如查询3下一个是8那么3和3之间的间隙会加锁此时为一个临键锁,8之前问𡁸也会加锁这里就是指优化后的间隙锁)有可能插入的数据不影响普通索引age=3的情况下还是会出现堵塞,是因为插入的数据正好在主键的间隙中而主键的间隙被锁住了
*普通索引可能插入一个相同的数据为防上幻读所以除了间隙,相同的数据也不行,因此为临键锁
__EOF__

本文链接:https://www.cnblogs.com/liu-jin/p/16984089.html
关于博主:hello~好久不见,喜欢的话点个赞吧
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)