《SQL基础》16. 锁
创始人
2024-05-30 04:37:03
0

    • 全局锁
    • 表级锁
      • 表锁
      • 元数据锁
      • 意向锁
    • 行级锁
      • 行锁
      • 间隙锁
      • 临键锁


计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。

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

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

全局锁

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

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

加全局锁
FLUSH TABLES WITH READ LOCK;

释放锁
UNLOCK TABLES;

数据备份(Windows命令)
mysqldump [-h 数据库主机地址] -u用户 -p密码 要备份的数据库 > 保存路径及备份文件名.sql

数据备份的相关指令,在MySQL管理章节还会详细介绍

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

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

在InnoDB引擎中,我们可以在备份时加上参数 --single-transaction 参数来完成不加锁的一致性数据备份。
mysqldump --single-transaction [-h 数据库主机地址] -u用户 -p密码 要备份的数据库 > 保存路径及备份文件名.sql

表级锁

表级锁,每次操作锁住整张表。锁定粒度大,发生锁冲突的概率最高,并发度最低。应用在MyISAM、InnoDB、BDB等存储引擎中。

对于表级锁,主要分为以下三类:

  • 表锁
  • 元数据锁(meta data lock,MDL)
  • 意向锁

表锁

对于表锁,分为两类:

  • 表共享读锁(read lock)
  • 表独占写锁(write lock)

读锁不会阻塞其他客户端的读,但是会阻塞写,也会阻塞当前客户端的写。
写锁既会阻塞其他客户端的读,又会阻塞其他客户端的写。

锁类型:READ,WRITE

加锁
LOCK TABLES 表名 锁类型;

释放锁
UNLOCK TABLES;

客户端断开连接会自动释放锁。

元数据锁

meta data lock,元数据锁,简写MDL。

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

这里的元数据,可以简单理解为一张表的表结构。也就是说,某一张表涉及到未提交的事务时,不能修改这张表的表结构。

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

常见的SQL操作时,所添加的元数据锁:

对应SQL锁类型说明
lock tables 表名 锁类型SHARED_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都互斥

查看元数据锁加锁情况
SELECT object_type, object_schema, object_name, lock_type, lock_duration FROM performance_schema.metadata_locks;

意向锁

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

意向锁分类:

  • 意向共享锁(IS)
    由语句 select … lock in share mode 添加 。与表锁共享锁(read)兼容,与表锁排他锁(write)互斥。
  • 意向排他锁(IX)
    由insert、update、delete、select … for update 添加。与表锁共享锁(read)及排他锁(write)都互斥,意向锁之间不会互斥。

一旦事务提交了,意向共享锁、意向排他锁都会自动释放。

查看意向锁及行锁加锁情况
SELECT object_schema, object_name, index_name, lock_type, lock_mode, lock_data FROM performance_schema.data_locks;

行级锁

行级锁,每次操作锁住对应的行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高。应用在InnoDB存储引擎中。
InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁。

对于行级锁,主要分为以下三类:

  • 行锁(Record Lock)
    锁定单个行记录的锁,防止其他事务对此行进行 update 和 delete。在RC、RR隔离级别下都支持。
  • 间隙锁(Gap Lock)
    锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事务在这个间隙进行 insert,产生幻读。在RR隔离级别下都支持。
  • 临键锁(Next-Key Lock)
    行锁和间隙锁组合,同时锁住数据,并锁住数据前面的所有间隙。在RR隔离级别下支持。

行锁

行锁,也叫记录锁。InnoDB实现了两种类型的行锁:

  • 共享锁(S)
    允许一个事务去读一行,阻止其他事务获得相同数据集的排它锁。
  • 排他锁(X)
    允许获取排他锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排他锁。

两种行锁的兼容情况如下:
在这里插入图片描述

常见的SQL语句,在执行时,所加的行锁如下:

SQL行锁类型说明
INSERT …排他锁自动加锁
UPDATE …排他锁自动加锁
DELETE …排他锁自动加锁
SELECT(正常)不加任何锁
SELECT … LOCK IN SHARE MODE共享锁需要手动在SELECT之后加LOCK IN SHARE MODE
SELECT … FOR UPDATE排他锁需要手动在SELECT之后加FOR UPDATE

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

  • 针对唯一索引进行检索时,对已存在的记录进行等值匹配时,将会自动优化为行锁。
  • InnoDB的行锁是针对于索引加的锁,不通过索引条件检索数据,那么InnoDB将对表中的所有记录加锁,此时就会升级为表锁。

查看意向锁及行锁的加锁情况
SELECT object_schema,object_name,index_name,lock_type,lock_mode,lock_data FROM performance_schema.data_locks;

间隙锁

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

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

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

临键锁

临键锁,是记录锁与间隙锁的组合,它的封锁范围,既包含索引记录,又包含索引区间。

临键锁的主要目的,也是为了避免幻读(Phantom Read)。如果把事务的隔离级别降级为RC,临键锁则也会失效。

相关内容

热门资讯

用这些词语写一段话,描写月夜的... 用这些词语写一段话,描写月夜的优美景色中秋之夜,坐在湖心亭品茶赏月,月光似水般倾泻于树影婆娑之中,并...
南笙在《楚乔传》中饰演谁? 南笙在《楚乔传》中饰演谁?《楚乔传》中南笙饰演的角色:兰淑仪
迪拜的机场的名称是什么 迪拜的机场的名称是什么  迪拜机场即迪拜国际机场,是阿拉伯联合酋长国迪拜的主要机场,也是阿联酋航空公...
C视频丨“机器人总动员”来啦!... 转自:四川在线 四川在线记者 薛维睿 成都观察 王翱化身...
广州多浦乐:5%以上股东减持股... 广州多浦乐电子科技股份有限公司于2025年4月23日在巨潮资讯网披露《关于持股5%以上股东减持股份的...
山羊为什么长胡子? 山羊为什么长胡子?山羊长期生长在山区,经常在树林、杂草、灌木等环境中觅食,为了保护下颚皮肤就进化出了...
“生态警务5.0”升级,崇明今... 转自:上观新闻上海市公安局崇明分局以枫桥式派出所创建为目标,持续升级“生态警务5.0”,将“全生态警...
飙涨超249%!全国第一!“西... 转自:央视财经挖掘机是基础设施建设的“标配”,是反映基础设施建设、观察固定资产投资等经济变化的风向标...
怎样概括文章主旨 怎样概括文章主旨如果想表达内容的主旨可以从文章的题目也可以成为文章的内容也可以从人物形象来判断、从文...
上海龙宇数据股份回购近5000... 上海龙宇数据股份有限公司于2025年6月17日发布关于股份回购进展公告,披露了公司在退市整理期内的股...
辞职写“因个人原因”,还能拿经... 转自:北京日报客户端“如果辞职申请上写了‘因个人原因’,是不是就再也拿不到经济补偿金了?”这是不少打...
英伟达加速布局欧洲,黄仁勋力推...   炒股就看金麒麟分析师研报,权威,专业,及时,全面,助您挖掘潜力主题机会! 21世纪经济报道记者...
在希望篮途计划里,你能看见中国... 姚明希望更多人能够关心和重视青少年体育,特别是乡村的青少年体育教育。“用网络的上话说,乡村老师们也不...
中国纸本艺术国际巡展在保加利亚... 转自:经济日报当地时间6月15日,“纸语千年 艺韵华章——中国当代纸本艺术国际巡展”首展在保加利亚索...
巴奴国际控股有限公司向港交所提... 6月16日,据港交所文件,巴奴国际控股有限公司向港交所提交上市申请书,联席保荐人为中金公司、招银国际...
内蒙古新能源装机规模突破1.4... 来源:中国新闻网 中新社呼和浩特6月16日电 (记者 李爱平)内蒙古自治区能源局16日消息,今年截至...
尺素金声丨工业企业效益恢复向好... 转自:上观新闻增长加快!日前,国家统计局数据显示:4月份,全国规模以上工业企业利润同比增长3.0%,...
英国向中东增派战机,英财政大臣... 来源:环球网 【环球网报道 记者 李梓瑜】据英国《独立报》当地时间15日报道,尽管英国皇家空军在伊朗...
痛心!湖南烟花爆炸事故已致1死... 转自:中华人民共和国应急管理部央视新闻客户端报道,据湖南临澧县委宣传部消息,6月16日8时23分许,...
国信证券-人形机器人行业周报(... (转自:研报虎)  市场表现:本周(6.9-6.13)我们构建的国信人形机器人指数下跌2.34%,弱...