从0开始回顾MySQL---系列七

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS AI 助手,专业版
简介: 锁1、为什么要加锁?1. 当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况,若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。2. 因此加锁是为了在多用户环境下保证数据库完整性和一致性。2、MySQL都有哪些锁呢?锁的分类:● 按操作分类: ○ 共享锁:也叫读锁。对同一份数据,多个事务读操作可以同时加锁而不互相影响 ,但不能修改数据 ○ 排他锁:也叫写锁。当前的操作没有完成前,会阻断其他操作的读取和写入● 按粒度分类: ○ 表级锁:会锁定整个表,开销小,加锁快;不会出现死锁;锁定力度大,发生锁冲突概率高,并


1、为什么要加锁?


  1. 当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况,若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。
  2. 因此加锁是为了在多用户环境下保证数据库完整性和一致性


2、MySQL都有哪些锁呢?


锁的分类

  • 按操作分类
  • 共享锁:也叫读锁。对同一份数据,多个事务读操作可以同时加锁而不互相影响 ,但不能修改数据
  • 排他锁:也叫写锁。当前的操作没有完成前,会阻断其他操作的读取和写入
  • 按粒度分类
  • 表级锁:会锁定整个表,开销小,加锁快;不会出现死锁;锁定力度大,发生锁冲突概率高,并发度最低,偏向 MyISAM
  • 行级锁:会锁定当前操作行,开销大,加锁慢;会出现死锁;锁定力度小,发生锁冲突概率低,并发度高,偏向 InnoDB
  • 页级锁:锁的力度、发生冲突的概率和加锁开销介于表锁和行锁之间,会出现死锁,并发性能一般
  • 按使用方式分类
  • 悲观锁:每次查询数据时都认为别人会修改,很悲观,所以查询时加锁
  • 乐观锁:每次查询数据时都认为别人不会修改,很乐观,但是更新时会判断一下在此期间别人有没有去更新这个数据

MyISAM和InnoDB存储引擎使用的锁

  • MyISAM采用表级锁(table-level locking)。
  • InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁
LOCK TABLE product_comment READ;
SELECT * FROM product_comment WHERE user_id = 912178 LOCK IN SHARE MODE
UNLOCK TABLE;
LOCK TABLE product_comment WRITE;
SELECT * FROM product_comment WHERE user_id = 912178 FOR UPDATE;
UNLOCK TABLE;

3、什么是乐观锁和悲观锁?如何实现 ?使用场景?


悲观锁

  • 概念:每次查询数据时都认为别人会修改,很悲观,所以一个事务拿到悲观锁后,其他任何事务都不能对该数据进行修改,只能等待锁被释放才可以执行。
  • 数据库中的行锁,表锁,读锁,写锁均为悲观锁。
  • 实现方式:使用数据库中的锁机制。

乐观锁

  • 概念:每次查询数据时都认为别人不会修改,很乐观,但是更新时会判断一下在此期间别人有没有去更新个数据;
  • 实现方式一般会使用版本号机制或 CAS 算法实现。具体来讲,在更新数据时,MySQL 会先检查当前数据的版本号,如果当前版本号与数据库中的版本号相同,则说明该数据没有被其他事务修改,可以更新该数据,并将版本号加 1,以此来表明数据已被变动;否则,说明该数据已被其他事务修改,不能更新该数据,此时 MySQL 会抛出异常。

悲观锁和乐观锁使用前提

  • 对于读的操作远多于写的操作的时候,一个更新操作加锁会阻塞所有的读取操作,降低了吞吐量,最后需要释放锁,锁是需要一些开销的,这时候可以选择乐观锁;
  • 如果是读写比例差距不是非常大或者系统没有响应不及时,吞吐量瓶颈的问题,那就不要去使用乐观锁,它增加了复杂度,也带来了业务额外的风险,这时候可以选择悲观锁。

4、什么是死锁?如何解决死锁?


死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环的现象。

常见的解决死锁的方法

  • 1、如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁机会。
  • 2、在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率;
  • 3、对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率;

如果业务处理不好可以用分布式事务锁或者使用乐观锁。

排查死锁的一般步骤:

  1. 查看死锁日志 show engine innodb status;
  2. 找出死锁 sql;
  3. 分析 sql 加锁情况;
  4. 模拟死锁案发 ;
  5. 分析死锁日志;
  6. 分析死锁结果。


5、InnoDB引擎的行锁是怎么实现的?

行锁 ,也称为记录锁 ,顾名思义就是在记录上加的锁对于 InnoDB 存储引擎来说,行级锁又分三种,或者说有三种行级锁算法。因此,即使对同一条记录加行锁 ,如果类型不同,起到的功效也是不同的。

InnoDB的行锁的主要实现如下:

  • Record Lock 记录锁

记录锁就是直接锁定某行记录。当我们使用唯一性的索引(包括唯一索引和聚簇索引)进行等值查询且精准匹配到一条记录时,此时就会直接将这条记录锁定。例如 select * from t where id =6 for update; 就会将 id=6 的记录锁定。


  • Gap Lock 间隙锁

间隙锁(Gap Locks) 的间隙指的是两个记录之间逻辑上尚未填入数据的部分,是一个左开右开空间。

间隙锁就是锁定某些间隙区间的。当我们使用等值查询或者范围查询,并且没有命中任何一个 record ,此时就会将对应的间隙区间锁定。例如 select * from t where id =3 for update; 或者 select * from t where id > 1 and id < 6 for update; 就会将(1,6)区间锁定。

  • Next-key Lock 临键锁

临键指的是间隙加上它右边的记录组成的左开右闭区间。⽐如上述的(1,6]、(6,8]等。

临键锁就是记录锁(Record Locks)和间隙锁(Gap Locks)的结合,即除了锁住记录本⾝,还要再锁住索引之间的间隙。当我们使用范围查询,并且命中了部分 record 记录,此时锁住的就是临键区间。注意,临键锁锁住的区间会包含最后一个record的右边的临键区间。例如 select * from t where id > 5 and id <= 7 for update; 会锁住(4,7]、(7,+∞)。

MySQL默认行锁类型就是 临键锁(Next-Key Locks) 。当使用唯一性索引,等值查询匹配到一条记录的时候,临键锁(Next-Key Locks)会退化成记录锁;没有匹配到任何记录的时候,退化成间隙锁。


6、隔离级别与锁的关系?


读未提交级别下,读取数据不需要加共享锁,这样就不会跟被修改的数据上的排他锁冲突

读已提交级别下,读操作需要加共享锁,但是在语句执行完以后释放共享锁;

可重复读级别下,读操作需要加共享锁,但是在事务提交之前并不释放共享锁,也就是必须等待事务执行完毕以后才释放共享锁。

可串行化是限制性最强的隔离级别,因为该级别锁定整个范围的键,并一直持有锁,直到事务完成。


7、有哪些优化锁方面的意见?


优化建议

  • 对于特定的事务,可以使用表锁来提高处理速度或者减少死锁的可能;
  • 尽可能让所有数据检索都能通过索引来完成,避免无索引行锁升级为表锁;
  • 合理设计索引,尽量缩小锁的范围;
  • 尽可能减少索引条件及索引范围,避免间隙锁;
  • 尽量控制事务大小,减少锁定资源量和时间长度;
  • 尽可能使用低级别事务隔离(需要业务层面满足需求)。

8、锁机制与 InnoDB 锁算法


MyISAM 和 InnoDB 存储引擎使用的锁

  • MyISAM 采用表级锁(table-level locking)。
  • InnoDB 支持行级锁(row-level locking)和表级锁,默认为行级锁。

表级锁和行级锁对比

  • 表级锁 MySQL 中锁定 粒度最大 的一种锁,对当前操作的整张表加锁,实现简单,资源消耗也比较少,加锁快,不会出现死锁。其锁定粒度最大,触发锁冲突的概率最高,并发度最低,MyISAM 和 InnoDB 引擎都支持表级锁。
  • 行级锁 MySQL 中锁定 粒度最小 的一种锁,只针对当前操作的行进行加锁。 行级锁能大大减少数据库操作的冲突。其加锁粒度最小,并发度高,但加锁的开销也最大,加锁慢,会出现死锁。

InnoDB 存储引擎的锁的算法有三种

  • Record lock:记录锁,单个行记录上的锁;
  • Gap lock:间隙锁,锁定一个范围,不包括记录本身;
  • Next-key lock:record+gap 临键锁,锁定一个范围,包含记录本身。

9、什么是意向锁?


意向锁是表级锁的一种,它是由数据库引擎自行维护的,用户自己无需也无法操作意向锁。如果用户想要在表上面添加一个共享锁或者排他锁的时候,需要做如下两个检查:

  • 检查这张表的排他锁有没有被其他事务占用,如果有,那么加锁失败;
  • 检查这张表中的行锁有没有被其他事务占用,如果有,那么加锁失败。

如果一张表的数据量特别大,然后我们又想在这张表上添加一个表锁,如果一行一行地去遍历这张表的数据有没有被锁住,效率比较低下。意向锁的存在正是为了解决这个问题。

  • 意向锁能够将检查行锁的时间复杂度由 O(n) 变成 O(1),其加锁的具体做法就是,当一个事务想要获取表中某一行的(共享/排他)锁的时候,它会自动尝试给当前表的加上意向(共享/排他)锁。然后,表锁和行锁之间的兼容互斥性就变成了表锁和意向锁之间的竞争关系
  • 有了意向锁这个表级锁之后,则我们直接判断一次就知道表中是否有数据行被锁定了。

意向锁的兼容性和互斥性

  • 意向锁之间互相兼容,因此针对表中的记录加锁不会因为意向锁而产生互斥,行锁之间的竞争关系是行锁与行锁的竞争,意向锁并不会参与其中;
  • 意向锁只会与表级的共享 / 互斥锁具有互斥性,这里互斥的作用就是用于检查这张表中的行锁有没有被其他事务占用;
  • 意向锁不会与行级的共享 / 排他锁互斥,如记录锁,间隙锁,临键锁。
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
存储 Java 索引
Python Sets详解!
在 Python 编程中,集合是一种无序、可迭代且可变的数据类型,不包含重复元素,用 `{}` 表示。集合基于哈希表,能高效检查元素是否存在,时间复杂度为 O(1)。集合支持多种操作,如并集、交集和差集。使用 `set()` 方法可进行类型转换,`frozenset()` 创建不可变的冻结集合。集合适用于去重及数学集合运算,但不能通过索引访问元素,且仅支持不可变类型的实例。
523 5
|
缓存 搜索推荐 安全
互联网人不可或缺的资源搜索引擎
我们改变不了世界,是世界改变了我们。Designed by QianYu1.猎手导航搜索网站简介史上最强大的资源搜索引擎,猎手导航集搜索引擎搜索、社交搜索、BT磁力搜索、学术文档搜索...
33253 0
|
3月前
|
人工智能 Linux API
10分钟造一个专属技能:OpenClaw自定义Skill开发+阿里云/本地部署及api配置实战手册
2026年,OpenClaw(Clawdbot)的真正强大之处,早已不只是使用现成插件,而是人人都能零代码写出自己的 Skill,让AI完全按照你的工作流执行任务。Skill 本质不是后台插件,而是给AI的一份清晰执行说明书——会写Markdown就能开发,不需要编程基础,不需要懂API,10分钟就能做出可运行、可复用、可分享的技能包。
2777 3
|
5月前
|
存储 弹性计算 安全
阿里云服务器、轻量应用服务器、gpu云服务器包年包月最新收费标准与活动价格参考
阿里云提供云服务器ECS、轻量应用服务器及GPU云服务器三类产品,涵盖经济型e、通用算力型u2a、计算型c9i等多种实例规格。收费标准因实例配置、带宽及云盘类型而异,如ECS实例按年付费价格从1561.65元(2核2G)至12472.06元(12核24G)不等。活动期间,轻量应用服务器2核2G峰值200M带宽低至38元/年,GPU云服务器如gn6i系列月付1694元起。用户可通过领取优惠券(如7.5折券)进一步降低成本,实现成本优化与业务需求匹配。
566 3
阿里云服务器、轻量应用服务器、gpu云服务器包年包月最新收费标准与活动价格参考
|
4月前
|
算法 搜索推荐 数据挖掘
基于手肘法的kmeans聚类数的精确识别【K-means聚类】Matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 🍎 往期回顾关注个人主页:Matlab科研工作室 👇 关注我领取海量matlab电子书和数学建模资料 🍊个人信条:格物致知,完整Matlab代码获取及仿真咨询内容私信。 🔥 内容介绍 一、先搞懂核心:为什么需要 “精确识别聚类数”? K-means 聚类的核心是将数据划分为 K 个 “相似度高、差异度大” 的簇,但 K 值的选择一直是算法应用的痛点 —— 选小了会导致簇内差异过大,选大了会出现过度聚类(簇间边界模糊),甚至失去实际业务意义。比如分析用户画像时
|
6月前
|
机器学习/深度学习 人工智能 弹性计算
阿里云服务器租用价格:最新包年包月、按量付费活动价格参考
阿里云服务器租用价格又更新了,租用阿里云轻量应用服务器一年价格是38元,经济型e实例2核2G3M带宽 40G ESSD Entry云盘特惠价99元1年,通用算力型u1实例2核4G5M带宽80G ESSD Entry云盘特惠价199元1年。通用算力型u2i实例4核8G1170.26元1年起。本文为大家展示本次价格更新之后,阿里云服务器的最新租用价格,包含经济型e、通用算力型u2i/u2a、计算型c9i/c9a、通用型g9i/g9a、内存型r9i/r9a等不同实例规格的活动价格,以供大家对比和选择参考。
1021 13
|
6月前
|
传感器 人工智能 安全
智能康养新趋势:养老院机器人核心技术解析与主流产品盘点
面对护理人力短缺,养老机器人正成为康养新力量。依托多模态感知、大模型交互与医疗级数据互联技术,实现安全监护、健康管理和情感陪伴。猎户星空、优必选、新松等企业推出多样化产品,覆盖居家与机构场景,推动养老服务智能化升级。(239字)
|
6月前
|
消息中间件 NoSQL 测试技术
电商秒杀系统架构实战
本文深入剖析电商秒杀系统架构设计,涵盖高并发应对、库存精准控制、订单高效处理等核心挑战。通过流量削峰、Redis预扣减、MQ异步解耦等技术,结合压测与容灾方案,构建稳定可靠的秒杀体系,并附核心源码,助力实战落地。(239字)
512 0
|
6月前
|
NoSQL Java 应用服务中间件
ERP业务(含源码)
JSH_ERP是一款基于SpringBoot+Vue的开源ERP系统,采用Mybatis、Ant-Design-Vue等主流技术栈,支持低代码开发。涵盖采购、销售、库存、财务等模块,适用于企业信息化管理。建议使用指定开发与服务器环境,确保稳定运行。(238字)
234 0
|
7月前
|
消息中间件 存储 缓存
批量获取淘宝商品评论:API 分页策略、并发控制与频率优化
批量获取淘宝商品评论:API 分页策略、并发控制与频率优化

热门文章

最新文章