前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >从物理层面对Mysql锁进行理解

从物理层面对Mysql锁进行理解

原创
作者头像
后台技术汇
修改2024-11-21 23:29:55
修改2024-11-21 23:29:55
1490
举报

“好事”文章分享

作者:Swift社区

文章:使用 AI 在医疗影像分析中的应用探索

这篇文章探讨了AI在医疗影像分析中的应用,重点介绍了卷积神经网络(CNN)等核心算法及其在实际案例中的成功应用,如谷歌和IBM的医疗影像诊断系统。文章还提供了基于TensorFlow的CNN医疗影像分类Demo,展示了数据处理、模型定义、训练和主函数的实现步骤。通过这些内容,读者可以深入了解AI在医疗影像分析中的潜力,并掌握相关技术的实际应用。

阅读了文章:https://blog.csdn.net/luoyang_java/article/details/125296886

并且参考了官方文档:https://dev.mysql.com/doc/refman/8.4/en/performance-schema-metadata-locks-table.html

背景知识

我们一般使用performance_schema.data_locks,它是MySQL 中的一个性能模式(Performance Schema)表,用于收集和显示关于数据锁(Data Locks)的详细信息。这个表提供了关于数据库中锁定的实时信息,包括锁定的类型、锁定的对象、持有锁的线程以及等待锁的线程等。

Mysql物理架构分层

  • 数据库的Server 层包括:连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
  • 数据库的存储引擎层:负责数据的存储和提取,其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。

数据库的锁

锁的分层和总览

数据库Server层的锁

MDL 的 Key

作用是:唯一标识一个锁,由namespace + dbname + tablename组成。

Mysql锁兼容性

任何 DML 语句都会加 MDL,这是保障 DDL 和 DML 一致性的基础,MDL 类型的兼容性矩阵如下(+为兼容,-为不兼容):

可以看到大部分共享锁之间是兼容的,但是 SU 和 SU 不兼容,这有效保证了一个表的多个 DDL 之间的操作是互斥,因为 SU 锁能升级为 X 锁,这种升级的方式是为了在没有真正执行到变更表结构的流程前依旧能保证读操作的并发性,所以 SU 能兼容 DML 又能阻塞 DDL。

MDL 的持有时长

除了给某个对象加锁和加什么类型的锁外,还需要确定加锁时长,MySQL 支持三种 MDL 持有时长:

数据库存储引擎层的锁

InnoDB 存储引擎既支持表锁,也支持行锁。

表锁:占用资源较少,但粒度很粗。有时候你仅仅需要锁住几条记录,但使用表锁的话相当于为表中的所有记录都加锁,所以性能比较差。

行锁:粒度更细,可以实现更精准的并发控制。

引擎表锁

我们通常说的表锁说的就是引擎表级锁,InnoDB 有 5 种表级锁:IS、IX、S、X、AUTO- INC。

S 锁和 X 锁

S 锁又名读锁,X 锁又名写锁,我们在上面介绍 MySQL 表锁时提到的引擎表锁说的就是这里的 S 锁和 X 锁,当使用 lock tables t read 就会加 S 锁,当使用 lock tables t write 就会加 X 锁。

除上述情况之外,一般都不会使用 S 锁和 X 锁。

在对表执行 select/insert/delete/update 语句时, InnoDB 存储引擎是不会为表添加表级别的 S 锁或者 X 锁的。即便是表没有索引也不会使用 S 锁和 X 锁,原因会在后面讲到。所以 S 锁和 X 锁在 InnoDB 中的地位是比较尴尬的,用处不大。

IS 锁和 IX 锁

IS 锁又名意向读锁,IX 锁又名意向写锁,当我们在对使用 InnoDB 存储引擎的表的某些记录加行级读锁之前,就需要先在表级别加一个 IS 表锁,当我们在对使用 InnoDB 存储引擎的表的某些记录加行级写锁之前,那就需要先在表级别加一个 IX锁 。

IS 锁 和 IX 锁 的使命只是为了后续在加表级别的 S锁 和 X锁 时判断表中是否有已经被加锁的记录,以避免用遍历的方式来查看表中有没有上锁的记录。也就是说当对表数据进行操作时就会加意向锁。写操作加 IX 锁,读操作加 IS 锁。

AUTO- INC 锁

在使用 MySQL 过程中,我们可以为表的某个列添加 AUTO_INCREMENT 属性,之后在插入记录时,可以不指定该列的值,系统会自动为它赋上单调递增的值。

表级锁兼容性

表级锁的兼容性矩阵如下(+为兼容,-为不兼容):

引擎行级锁

整个 InnoDB 存储引擎,最重要的就是行级锁,同时行级锁也是最容易观察的锁。InnoDB 有 4 种行级锁:Record Lock、Gap Lock、Next-Key Lock、Insert Intention Lock。在代码层面上它们还有以下叫法:

  • Record Lock -> LOCK_REC_NOT_GAP
  • Gap Lock -> LOCK_GAP
  • Next-Ley Lock -> LOCK_ORDINARY
  • Insert Intention Lock -> LOCK_INSERT_INTENTION
Record Lock

Record Lock 即记录锁,该锁只能加在一行记录的索引上,如果没有记录就不会有记录锁。

记录锁有 S 锁 和 X 锁 之分的,叫读记录锁和写记录锁,当一个事务给一条记录添加读记录锁后,其他事务也可以继续在该记录上添加读记录锁 ,但不可以添加写记录锁;

当一个事务给一条记录添加写记录锁后,其他事务既不可以在该记录添加读记录锁 ,也不可以添加写记录锁。

读记录锁比较特殊,因为 MVCC 存在,读操作是可以不加锁的。

Gap Lock

在讲解 MVCC 的时候,有提到过 REPEATED READ 隔离级别下是不能解决幻读的,但是通过主动加锁是可以避免幻读的。

幻读就是前一次查询不存在的东西下一次查询出现了,其实就是在事务 A 中的两次查询之间,事务 B执行插入操作,被事务 A 感知到了。所以要解决幻读就是要阻塞插入操作。

InnoDB 专门提供了一个 Gap Lock,又称间隙锁,通过锁住一个数据区间来解决幻读的问题。

Next-Key Lock

当我们即要锁住某条记录,又想阻止其他事务在该记录前面的间隙插入新记录,这个时候就会使用 Next-Key Lock,它就是一个 Record Lock 和 Gap Lock 功能的集合,它既能保护该条记录,又能阻止别的事务将新记录插入被保护记录前面的间隙。也就是左开右闭区间(其他数据库还有 Previous-Key Lock,原理一样,只是左闭右开而已)

Insert Intention Lock

Insert Intention Lock 即插入意向锁,它是特殊的 Gap Lock 锁,专为 Insert 操作设计。

行级锁兼容性

总结

MySQL 中涉及到两个大层面的锁:server 层锁和存储引擎锁,又涉及到各种小层面,包括 MDL、MySQL 表锁、InnoDB 表锁以及 InnoDB 行锁

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • “好事”文章分享
  • 背景知识
  • Mysql物理架构分层
  • 数据库的锁
    • 锁的分层和总览
    • 数据库Server层的锁
      • MDL 的 Key
      • Mysql锁兼容性
      • MDL 的持有时长
    • 数据库存储引擎层的锁
      • 引擎表锁
      • 引擎行级锁
      • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档