Mysql锁

2023-11-13

1. 概述

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

2. 分类

mysql中的锁,按照锁的粒度分,分为一下三类:

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

3. 全局锁

全局锁是对整个数据库实例加锁,加锁后整个实例处于只读状态,后续的DML的写语句,DDL语句,已经更新的事务操作提交语句都将被阻塞。其典型的应用场景是做全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性。

  • 加全局锁
flush table with read lock;
  • 使用mysqldump工具对数据库进行备份
mysqldump -uroot -p1234 itcast(备份的数据库名) > itcast.sql
  • 解锁
unlock tables;
  • 通过全局锁实现数据库备份操作
  1. 创建三个终端,来模拟三个数据库连接

在这里插入图片描述
2. 加全局锁

flush table with read lock;

在这里插入图片描述
3. 执行数据库备份(在window命令行下)

mysqldump  -h127.0.0.1 -uroot -p123456 mysql_learn > /Users/jackchai/Desktop/Self-study-notes/test/db011.sql 

在这里插入图片描述
4. 释放锁

unlock tables;

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

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

在innodb存储引擎中,我们可以在备份时加上参数--single-transaction参数来完成不加锁的一致性备份

mysqldump --single-transaction -uroot -p123456 itcast > itcast.sql

4. 表级锁

表级锁,每次操作锁住整张表。锁定粒度大,发生锁冲突的概率最高,并发度最低。应用在MyIsam、innoDB、BDB等存储引擎中。对于表级锁,主要分为三类:

  1. 表锁
  2. 元数据锁(meta data lock,MDL)
  3. 意向锁
  • 表锁

对于表锁,分为两类:

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

语法:

  1. 加锁:lock tables 表名… read/write
  2. 释放锁:unlock tables / 客户端断开连接
  • 测试

一个客户端加读锁,所有客户端可读数据库(但不能更新数据库)

在这里插入图片描述

一个客户端加表锁,该客户端可读可写,其它客户端不能进行任何操作

在这里插入图片描述

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

  • 元数据锁(MDL)

MDL加锁过程是系统自动控制的,无需显示使用,在访问一张表的时候会自动加上。MDL锁主要作用是维护元数据(表结构)的数据一致性,在表上有活动事务的时候,不可以对元数据进行写入操作。

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

对应SQL 锁类型 说明
lock tables xxx read/write shared_read_only/shared_no_read_write
select、select…lock in share mode shared_read 与shared_read、shared_write兼容,与Exclusive互斥
insert、update、delete、select…for update shared_write 与shared_read、shared_write兼容,与Exclusive互斥
alter table… exclusive 与其他的MDL互斥
  • 案例

一个数据库连接加上shared_read锁或shared_write和其他连接是共享的

在这里插入图片描述

一个连接加上shared_read/shared_write时另一个连接不能加上exclusive锁

在这里插入图片描述
查看元数据锁

select object_type, object_schema,object_name,lock_type,lock_duration from performance_schema.metadata_locks

在这里插入图片描述

  • 意向锁

为了避免DML在执行时,加的行锁与表锁冲突,在innoDB引入了意向锁,使用表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查。(加入行锁的时候会给表加个意向锁,加表锁的时候会判断意向锁和表锁是否兼容来决定是否加表锁)

意向共享锁(IS):由语句select…lock in share mode添加
意向排他锁(IX):由insert、update、delete、select… for update添加。

通过以下sql,查看意向锁及行锁的加锁情况

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

加IS锁

在这里插入图片描述

加IX锁

在这里插入图片描述

5. 行级锁

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

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

innoDB存储引擎实现了一下两种类型的行锁:

  1. 共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。
  2. 排他锁(X):允许获取排他锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排他锁。
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锁进行搜索和索引扫描,以防止幻读

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

通过一下SQL,查看意向锁及行锁的加锁情况

select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;
  • 间隙锁/临键锁

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mysql锁 的相关文章

  • 使用 Hibernate 在 MySQL 中存储字节数组

    我正在尝试保存带有字节数组字段的实体 我在 MySQL 数据库之上使用 Hibernate 和 JPA 这是字段定义 对于嵌入式 H2 数据库来说效果很好 Entity name blob public class Blob Lob Bas
  • MySQL有两个不同的密码?

    我确信它们是不同事物的密码 但我不确定是什么 当在终端连接到 MySQL 时 我输入 usr LOCAL mysql BIN mysql h host u username p然后系统会提示我输入密码 密码是 但是当使用 PHP 连接到 M
  • Java 从 SQL 数组获取 ResultSet 失败

    我试图从数据库中检索电子邮件地址 但没有成功 我的代码如下 Main System out println PortfolioData getEmails 58 So Far Returning null 投资组合数据 public sta
  • 如果列有多个逗号分隔值,如何过滤 mysql 数据?

    我想问如果检查条件以查找具有多个逗号分隔值的列 如何过滤 mysql 数据 我给你举个例子 我有下表说 tbitems id item names item types item features 1 item 1 8 6 10 5 4 9
  • 在 MySQL 数据库中存储图像文件或 URL?哪个更好? [复制]

    这个问题在这里已经有答案了 可能的重复 在数据库中存储图像 是还是否 https stackoverflow com questions 3748 storing images in db yea or nay 数据库中的图像与文件系统中的
  • SQL统计高于和低于平均分的学生人数

    我在下面有一个示例表 我试图获取高于平均分数的学生人数和低于平均分数的学生人数 name subject classroom classarm session first term score first term grade std1 m
  • MYSQL中收盘价的简单移动平均线计算和更新表

    我可以使用一些帮助 最好是虚拟指南 来更新下表 CREATE TABLE SYMBOL day date NOT NULL open decimal 8 3 DEFAULT NULL high decimal 8 3 DEFAULT NUL
  • MySQL InnoDB 查询性能

    我正在尝试优化一个简单的 sql 查询 该查询将多次运行大量数据 这是场景 MySQL 与 InnoDB 表 where 和 join 中使用的所有字段都已索引 表有 FK 我不需要查询的整个缓存 但每个表的缓存是可能的 表有更多的更新 插
  • Preg_replace() 删除除查询结尾之外的所有内容

    首先 为我糟糕的英语感到抱歉 我有这样的疑问 SELECT t1 SELECT COUNT FROM table a t2 WHERE t1 id t2 id c AND t2 status 1 AS aula FROM table c t
  • C#:SQL 查询生成器类

    在哪里可以找到好的 SQL 查询构建器类 我只需要一个简单的类来构建 SQL 字符串 仅此而已 我需要它用于 C 和 MySql 我真的不需要像 Linq 或 NHibernate 这样的东西 谢谢 由于 Google 将我引导至此页面 我
  • MySQL+子串怎么做? + 替换?

    我不太擅长 SQL 希望能够变得更好 我在尝试执行某些表操作时遇到一些麻烦 我希望能够从下面的 ProgUID 列中选择子字符串 就像是 SUBSTRING table ProgUID 3 12 这将为我提供 ProgUID P CAMVE
  • 通过连接从两个表中删除?

    我有两个表如下 tbl1 tbl2 id article id title image whole news tags author older datetime 其中 tbl1 id gt tbl2 article id 如何从两个表中删
  • 当“修复表”查询在 mysql 中不起作用时该怎么办?

    我收到此错误 表的存储引擎不支持修复 当我尝试使用查询修复表时repair table tbl college master 表是 innodb 类型 但我不知道我收到此错误 See 手册 http dev mysql com doc re
  • Mysql innoDB 不断崩溃[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我的数据库 mysql 服务器不断崩溃 重新启动 我不知道该怎么办 我不断在 dbname org err 文件中收到以下内容 13120
  • 为什么 MySQL 创建带有 _seq 后缀的表?

    我创建了一个 InnoDB 表 名为foo在 MySQL 中 一旦我对表执行插入操作 我就会看到另一个表foo seq被建造 如果我删除自动生成的表 它会在下一次插入后出现 是什么原因造成的 听起来像是正在创建一个序列 您是否有自动生成的主
  • Hibernate 对集合的查询过滤器

    我想执行以下查询 from Item i where i categoryItems catalogId catId 然而 这会产生以下异常 非法尝试取消引用集合 所以我用谷歌搜索 找到了这个 Hibernate 论坛帖子https for
  • MySQL 使用 ALTER IGNORE TABLE 出现重复错误

    我的 MySQL 中有一个有重复项的表 我尝试删除重复项并保留一项 我没有主键 我可以通过以下方式找到重复项 select user id server id count as NumDuplicates from user server
  • MySQL MIN/MAX 所有行

    我有桌子Races与行ID Name and TotalCP 我选择分钟 TotalCP FROM Races 但是我想选择具有最小值的整行 我如何在单个查询中做到这一点 从聚合值获取整行的一般形式是 SELECT FROM Races W
  • MySQL 按重复项从上到下排序

    我有一个lammer问题 因为我不是mysql专业人士 我有类似的字段 id color 1 red 2 green 3 yellow 4 green 5 green 6 red 我想按重复项进行分组 最常见的重复项先进行分组 所以应该这样
  • 将第三个表链接到多对多关联中的桥接表

    设计这个数据库的正确方法是什么 这是我设置表格的方式 我在名为 教师 的表和名为 仪器 的表之间存在多对多关系 然后我有一个连接两者的桥接表 我想将另一个表与 BRIDGE 表关联起来 意思是乐器 老师的组合 该表有 3 行 指定老师可以教

随机推荐

  • 通俗易懂的机器学习——筛选垃圾邮件(贝叶斯分类)

    筛选垃圾邮件 贝叶斯分类 背景及应用 贝叶斯公式 数据集 引入依赖包 数据预处理 全局变量 过滤所有非中文词语 读取邮件 加载邮件 获取概率表 划分训练集和测试集 计算分词的概率表 保存概率表 检查邮件是否为垃圾文件 获取分词对应的概率字典
  • SQL-DataCamp-Joining Data in SQL

    1 Introduction to Joins 1 1 Introduction to INNER JOIN video 1 2 INNER JOIN PostgreSQL was mentioned in the slides but y
  • 大数据课程K17——Spark的协同过滤法

    文章作者邮箱 yugongshiye sina cn 地址 广东惠州 本章节目的 了解Spark的协同过滤概念 一 协同过滤概念 1 概念 协同过滤是一种借助众包智慧的途径 它利用大量已有的用户偏好来估计用户对其未接触过的物品的喜好程度 其
  • Qt开发 之 Windows资源管理器模仿 并 小超越

    文章目录 1 简述 2 优化点 2 1 内存处理 2 1 1 Windows的资源管理器 2 1 1 1 大图标模式 2 1 1 2 超大图标模式 2 1 1 3 其他模式 2 1 2 用Qt做的类似资源管理器的软件 2 2 滑动处理 2
  • geek卸载工具安装和使用

    软件描述 geek可以快速彻底将软件卸载后的垃圾程序删除干净 并且小巧无广告 无需安装 整个大小仅仅几兆 一 软件获取 1 通过网盘直接下载 https pan quark cn s 29d5661ca7de 2 官网下载 打开官网后点击d
  • Spring@Autowired注解与自动装配

    1 配置文件的方法 我们编写spring 框架的代码时候 一直遵循是这样一个规则 所有在spring中注入的bean 都建议定义成私有的域变量 并且要配套写上 get 和 set方法 Boss 拥有 Office 和 Car 类型的两个属性
  • IDER代码检查工具

    随着业务的发展 系统会越来越庞大 原本简单稳定的功能 可能在不断迭代后复杂度上升 潜在的风险也随之暴露 导致最终服务不稳定 造成业务价值的损失 而为了减少这种情况 其中一种比较好的方式就是提高代码质量 比如通过代码审查 从而降低错误风险 但
  • Qt控件米白色主题风格,QSS控件样式,Qt风格,Qt控件源代码

    米白色主题控件风格 使用c 开发 原生控件主题风格 主题预览图 由www qt ui com设计开发完成 提供主题源代码 主题下载地址 http www qt ui com theme UIGTE001 主题预览图 产品官网 www qt
  • 【QT进阶】第五章 QT绘图之自定义控件--仪表盘绘制

    作者主页 凉开水白菜 作者简介 共同学习 互相监督 热于分享 多加讨论 一起进步 专栏目录 零基础学QT 文章导航篇 专栏资料 https pan baidu com s 192A28BTIYFHmixRcQwmaHw 提取码 qtqt 点
  • 2.6 矩阵的初等变换

    文章目录 初等变换 行 列 定理 等价 性质 初等方阵 初等方阵与初等变换的关系 三种初等方阵的行列式 逆矩阵 定理 初等矩阵的作用 定理 A可逆条件总结 初等变换法求逆矩阵 初等行变换法 只做行变换 参考 初等变换 行 列 下面是三种初等
  • (5)Qt中的日期和时间

    QDate 日期对象格式化 d 没有前导零的日子 1 to 31 dd 前导为0的日子 01 to 31 ddd 显示 缩写 周一 周二 周三 周四 周五 周六 周日 dddd 显示 完整 星期一 星期二 星期三 星期四 星期五 星期六 星
  • 快速转载他人CSDN博客到自己博客中

    1 右键页面 选择审查元素 2 进入HTML代码页面 选择article content 如何快速找到article content 以谷歌浏览器为例子 鼠标右击 选择检查 点击小箭头 并把鼠标移动到文章内容中 看到baidu pl 点击下
  • 使用 JMeter 完成常用的压力测试

    JMeter 完成常用的压力测试 文档选项 将此页作为电子邮件发送 拓展 Tomcat 应用 下载 IBM 开源 J2EE 应用服务器 WAS CE 新版本 V1 1 摘自 http www 360doc com showWeb 0 0 2
  • C++基础之四个默认函数(构造,析构,拷贝构造,赋值运算符重载)

    文章目录 一 构造函数 构造函数的默认值 赋值方法 二 析构函数 三 拷贝构造函数 四 赋值运算符重载函数 一 构造函数 类的构造函数是类的一种特殊的成员函数 它会在每次创建类的新对象时执行 构造函数的名称与类的名称是完全相同的 并且不会返
  • A State-of-the-Art Survey on Deep Learning Theory and Architectures论文翻译分析

    A State of the Art Survey on Deep Learning Theory and Architectures 摘要 近年来 深度学习在各种应用领域取得了巨大成功 机器学习这一新领域发展迅速 已应用于大多数传统应用领
  • (超详细、带图带源码)Nacos注册中心的搭建与测试

    前言 本系列是从头开始进行学习Nacos的相关知识 从相关概念到业务开发等等 本篇是第三篇 主要知道为什么需要注册中心 为什么选择Nacos作为注册中心和Nacos作为注册中心的快速搭建 入门篇 阿里Nacos系列 为什么要选择Nacos和
  • 密码学技术在区块链系统中的应用

    密码学技术是区块链数据核心技术 P2P网络协议 共识机制 密码学技术 账户与存储模型 中核心的技术点 区块链主要用到的密码算法有哈希算法和加密算法 加密又包括对称性加密和非对称性加密两个概念 区块链系统里面一般常用到的是非对称加密 本文首先
  • 02-neo4j的基本命令

    1 插入节点 插入一个Person类别的节点 且这个节点有一个属性name 属性值为Andres CREATE n Person name 梁川川 CREATE n Person name 谢静静 CREATE n Person name
  • MySql数据库基础--常用函数&视图

    常用函数 日期函数 获取当前日期 select NOW 获取指定日期的日部分 select day now 获取指定日期的月部分 SELECT MONTH NOW 获取指定日期的n年部分 SELECT YEAR NOW date forma
  • Mysql锁

    文章目录 1 概述 2 分类 3 全局锁 4 表级锁 5 行级锁 1 概述 锁是计算机协调多个进程或线程并发访问某一资源的机制 在数据库中 除传统的计算资源 CPU RAM I O 的争用以外 数据也是一种供许多用户共享的资源 如何保证数据