MySQL锁

 

 

 分类

 

MySQL中的锁,按照锁的粒度分,分为以下三类:

 

  1. 全局锁:锁定数据库中的所有表。
  2. 表级锁:每次操作锁住整张表。
  3. 行级锁:每次操作锁住对应的行数据。

全局锁

全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句,DDL语句,已经更新操作的事务提交语句都

将被阻塞。

其典型的使用场景是做全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性。

 

flush tables with read lock; (加锁)

mysqldump-uroof-p1234 itcast > itcast.sql;( itcast是数据库,此处将数据库 itast备份到itcast. sql中)(这是提供的一个工具不要在mysql命令中执行此语句)

 

Unlock tables;(解锁)

 

特点

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

  1. 如果在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆。
  2. 如果在从库上备份,那么在备份期间从库不能执行主库同步过来的二进制日志 (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__

本文作者liuliu的小家
本文链接https://www.cnblogs.com/liu-jin/p/16984089.html
关于博主:hello~好久不见,喜欢的话点个赞吧
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Bepowerful  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示