开发易忽视的问题:InnoDB 行锁设计与实现

开发易忽视的问题:InnoDB 行锁设计与实现

存储模型和锁机制

存储结构

  • 数据页

    • InnoDB 将表的数据存储在数据页中,每个页默认大小为 16KB。
    • 数据页中存储多个行记录,行记录按照主键顺序存放。

    行格式

    • InnoDB 支持多种行格式,包括 Compact、Redundant、Dynamic 和 Compressed。这些格式影响数据的存储方式,但对行锁机制影响不大。

    索引组织表

    • InnoDB 是一种索引组织表(Index-Organized Table),即数据按主键聚集存储,这意味着行数据实际上存储在 B+ 树的叶子节点上。
    • 非主键索引以主键作为叶子节点指向的数据行的指针。

行锁实现

  • 基于索引的锁定

    • 行级锁是基于索引实现的,具体来说,InnoDB 锁定的是索引上的记录,而不是实际的数据行。
    • 当事务要锁定一行时,它实际上是在锁定该行所在索引的一个“间隙”或确切的索引键。

    锁的类型

    • Record Lock:锁定单个索引记录。
    • Gap Lock:锁定索引记录之间的间隙,用于防止幻影读,通常用于范围查询。
    • Next-Key Lock:结合了 Record Lock 和 Gap Lock,在索引记录及其前面的间隙上加锁。这样可以防止其他事务插入新的索引记录。

    锁的存储

    • 锁信息并不是直接存储在行本身,而是存储在内存中的锁表中。
    • 锁表包含有关每个锁的信息,如锁的类型、被锁定的事务等。

    压缩行锁

    • 为了减少锁的开销和提高效率,InnoDB 使用了一种称为锁压缩(Lock Compression)的技术,使得对于连续范围内的锁,仅需要维护较少数量的锁对象。

    意向锁

    • 在表级别实现的一种锁,它表示某个事务想要在行级别获得锁。这种设计使得 InnoDB 能够快速判断是否可以安全地对整个表进行锁定。

实际操作

  • 锁定机制依赖于索引,因此合理设计索引可以有效地利用行级锁。
  • 当没有适当的索引来支持查询时,InnoDB 可能会退化到锁定更多的行甚至整个表。

锁表分析

  • InnoDB 的锁表是用来管理和维护所有活动事务的锁信息的关键组件。锁表并不是一个物理存储的表,而是一种内存数据结构,其设计与实现旨在高效地处理并发事务,确保数据一致性和完整性。

锁表的设计和实现

  • 锁结构

    • 每个锁都有一个锁结构,用于表示特定事务对某个资源(比如行或间隙)的锁定。
    • 锁结构包含的信息包括:被锁定的资源、锁类型(如共享锁、排他锁)、拥有锁的事务ID等。

    锁的存储

    • 锁信息保存在内存中,具体来说,是通过一个全局的哈希表来维护所有当前活动的锁。
    • 这个哈希表以被锁定的资源为键,以相应的锁结构链表为值。这样可以快速查找某个资源上的锁。

    锁类型

    • InnoDB 支持多种类型的锁,如前面提到的 Record Lock、Gap Lock 和 Next-Key Lock。每种锁类型在锁表中都有不同的表现形式和处理逻辑。
    • 锁的类型决定了如何对其他事务进行阻塞或允许并发访问。

    锁兼容性

    • 锁表需要处理锁的兼容性问题,即检测新请求的锁是否与现有锁冲突。共享锁与共享锁兼容,但排他锁则与其他任何锁冲突。
    • 通过锁兼容矩阵,InnoDB 可以有效地决定是否授予新的锁请求。

    死锁检测

    • InnoDB 实现了自动死锁检测机制,通过分析锁表中的锁依赖图来判断是否存在死锁循环
    • 一旦发现死锁,InnoDB 会主动回滚其中一个事务,以解除死锁状态。

    锁等待队列

    • 对于因锁冲突而无法立即获得的锁请求,InnoDB 将其放入锁等待队列中。
    • 当锁释放时,InnoDB 会检查锁等待队列,并尝试授予队列中合适的锁请求。

    性能优化

    • 为了减少锁开销,InnoDB 使用了一些优化技术,比如锁压缩。这种技术在可能的情况下将多个相邻范围的锁合并成一个,从而减少锁对象的数量。

案例分析

  • 假设我们有一个名为 employees 的表,其中包含如下字段:id(主键),namesalary。该表的数据如下:

  • 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 现在我们有两个事务对这个表进行操作:

    • 事务A:将 Bob 的薪水增加 1000。
    • 事务B:尝试读取 Bob 和 Carol 的信息。

操作步骤及锁机制

  • 事务A开始

    • 执行 START TRANSACTION;
    • 执行 UPDATE employees SET salary = salary + 1000 WHERE name = 'Bob';
    • 假如name字段没有添加索引,InnoDB 使用主键索引进行全表扫描,来定位 Bob 的行并获取行级锁(Record Lock)在 id=2 上,因为这是精确的行更新。

    事务B开始

    • 执行 START TRANSACTION;
    • 执行 SELECT * FROM employees WHERE name IN ('Bob', 'Carol') FOR UPDATE;
    • 因为事务A已经持有了 id=2 的排他锁,事务B将在此处被阻塞,等待事务A释放对 Bob 的锁。

    锁表存储与管理

    • 当事务A执行更新时,InnoDB 会在内存中的锁表中创建一个记录锁条目,标记该行(id=2)已被锁定,并且事务A拥有一个排他锁。
    • 锁表的哈希结构会以 id=2 为键,指向一个链表,该链表包含事务A的锁信息。
    • 当事务B尝试获取锁时,会检查锁表,发现冲突,因此会将其请求放入等待队列中,关联到相同的哈希键(即 id=2)。

    事务A提交或回滚

    • 事务A完成后,执行 COMMIT;ROLLBACK;
    • InnoDB 释放 id=2 的排他锁,从锁表中移除相应的锁条目。
    • 此时,事务B会从等待队列中唤醒,重新尝试获取锁,现在它能够获取到 id=2 的共享锁或排他锁(视具体操作而定)。

    事务B继续

    • 事务B成功获得锁后,可以读取 Bob 和 Carol 的信息。
    • 完成后执行 COMMIT; 释放所有锁。

结论

  • 通过这个案例,我们可以看到 InnoDB 如何使用行级锁和锁表来管理并发访问。锁表是一个中间存储,用于跟踪当前所有活动事务的锁状态

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1540933.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

VSCode开发ros程序无法智能提示的解决方法(二)

VSCode开发ros程序无法智能提示的解决方法(二) 说明解决 说明 在Ubuntu下使用vscode开发ros程序,无法进行智能提示。 解决 将C/C更换为v1.20.5版本,如下图

sheng的学习笔记-AI-强化学习(Reinforcement Learning, RL)

AI目录:sheng的学习笔记-AI目录-CSDN博客 基础知识 什么是强化学习 强化学习(Reinforcement Learning, RL),又称再励学习、评价学习或增强学习,是机器学习的范式和方法论之一,用于描述和解决智能体&#…

Trainer API训练属于自己行业的本地大语言模型 医疗本地问答大模型示例

Trainer API 是 Hugging Face transformers 库中强大而灵活的工具,简化了深度学习模型的训练和评估过程。通过提供高层次的接口和多种功能,Trainer API 使研究人员和开发者能够更快地构建和优化自然语言处理模型 文章目录 前言一、Trainer API它能做什么…

RNN的反向传播

目录 1.RNN网络:通过时间反向传播(through time back propagate TTBP) 2.RNN梯度分析 2.1隐藏状态和输出 2.2正向传播: 2.3反向传播: 2.4问题瓶颈: 3.截断时间步分类: 4.截断策略比较 5.反向传播的细节 ​编辑…

达梦数据库踩坑

提示:第一次接触达梦,是真的不好用,各种报错不提示详细信息,吐槽归吐槽,还是需要学习使用的。 前言 题主刚接触达梦数据库时,本来是想下载官网的连接工具进行数据库连接的,但是谁曾想&#xff…

监控易监测对象及指标之:全面监控GBase数据库

在数字化时代,数据库作为企业核心数据资产的管理中心,其稳定性和性能直接关系到业务的连续性和企业的运营效率。GBase数据库作为高性能的分布式数据库系统,广泛应用于各类业务场景。为了确保GBase数据库的稳定运行和高效性能,对其…

git安装包夸克网盘下载

git安装包夸克网盘下载 git夸克网盘 git网站上的安装包下载速度有点慢,因此为了方便以后下载就将文件保存到夸克网盘上,链接:我用夸克网盘分享了「git」,点击链接即可保存。 链接:https://pan.quark.cn/s/07c73c4a30…

C++速通LeetCode中等第12题-矩阵置零(空间O(1)含注释)

class Solution { public:void setZeroes(vector<vector<int>>& matrix) {int m matrix.size();int n matrix[0].size();int flag_col0 false, flag_row0 false;//先记录第一行和第一列是否有零for (int i 0; i < m; i) {if (!matrix[i][0]) {flag_col…

基于单片机的智能健康水杯设计

摘要&#xff1a;随着时代的发展&#xff0c;单片机领域不断扩张。人工智能产品的出现改变了人们的生活方式。智能产品不仅加快了人们的生活节奏&#xff0c;还为人们的安全提供了保障。在快节奏生活的同时&#xff0c;人们开始越来越关注自己的身体健康&#xff0c;基于 52 单…

高级java每日一道面试题-2024年9月20日-分布式篇-什么是CAP理论?

如果有遗漏,评论区告诉我进行补充 面试官: 什么是CAP理论&#xff1f; 我回答: 在Java高级面试中&#xff0c;CAP理论是一个经常被提及的重要概念&#xff0c;它对于理解分布式系统的设计和优化至关重要。CAP理论是分布式系统理论中的一个重要概念&#xff0c;它描述了一个分…

c++11右值引用和移动语义

一.左值引用和右值引用 什么是左值引用&#xff0c;什么是右值引用 左值是一个表示数据的表达式&#xff08;变量名解引用的指针&#xff09;&#xff0c;我们可以获取到它的地址&#xff0c;可以对它赋值&#xff0c;左值可以出现在符号的左边。使用const修饰后&#xff0c;…

通威股份半年报业绩巨降:销售费用大增,近一年股价跌四成

《港湾商业观察》施子夫 王璐 光伏领域龙头企业通威股份&#xff08;600438.SH&#xff09;交出的半年报延续了2023年营收和净利润双下滑趋势&#xff0c;幅度显得更大。 即便受行业波动影响&#xff0c;但如何重整及提升盈利能力&#xff0c;通威股份还需要给出解决方案。​…

vue项目关闭浏览器中的全屏错误提示

vue.config.js module.exports {devServer: {client: {overlay: false }} }

c++优先级队列自定义排序实现方式

1、使用常规方法实现 使用结构体实现自定义排序函数 2、使用lambda表达式实现 使用lambda表达式实现自定义排序函数 3、具体实现如下&#xff1a; #include <iostream> #include <queue> #include <vector>using namespace std; using Pair pair<in…

什么是大模型的泛化能力?

大模型的泛化能力指的是模型在未见过的数据上表现的能力&#xff0c;即模型不仅能在训练数据上表现良好&#xff0c;也能在新的、未知的数据集上保持良好的性能。这种能力是衡量机器学习模型优劣的重要指标之一。 泛化能力的好处包括但不限于&#xff1a; 提高模型的适应性&a…

Qt 构建目录

Qt Creator新建项目时&#xff0c;选择构建套件是必要的一环&#xff1a; 构建目录的默认设置 在Qt Creator中&#xff0c;项目的构建目录通常是默认设置的&#xff0c;位于项目文件夹内的一个子文件夹中&#xff0c;如&#xff1a;build-项目名-Desktop_Qt_版本号_编译器类型_…

电子烟智能化创新体验:WTK6900P语音交互芯片方案,融合频谱计算、精准语音识别与流畅音频播报

一&#xff1a;开发背景 在这个科技日新月异的时代&#xff0c;每一个细节的创新都是对传统的一次超越。今天&#xff0c;我们自豪地宣布一项革命性的融合——将先进的语音识别技术与电子烟相结合&#xff0c;通过WTK6900P芯片的卓越性能&#xff0c;为您开启前所未有的个性化…

稀疏向量 milvus存储检索RAG使用案例

参考&#xff1a; https://milvus.io/docs/hybrid_search_with_milvus.md milvus使用不方便&#xff1a; 1&#xff09;离线计算向量很慢BGEM3EmbeddingFunction 2&#xff09;milvus安装环境支持很多问题&#xff0c;不支持windows、centos等 在线demo&#xff1a; https://co…

Hadoop 常用生态组件

Hadoop核心组件 安装 Hadoop 时&#xff0c;通常会自动包含以下几个关键核心组件&#xff0c;特别是如果使用了完整的 Hadoop 发行版&#xff08;如 Apache Hadoop、Cloudera 或 Hortonworks 等&#xff09;。这些组件构成了 Hadoop 的核心&#xff1a; 1. HDFS&#xff08;H…

-bash: apt-get: command not found -bash: yum: command not found

1. 现象&#xff1a; 1.1. 容器内使用apt-get, yum 提示命令未找到 1.2. dockerfile制作镜像时候&#xff0c;使用apt-get, yum同样报此错误。 2.原因&#xff1a; 2.1. linux 分为&#xff1a; 1. RedHat系列&#xff1a; Redhat、Centos、Fedora等 2. Debian系列&#xff1a…