InnoDB如何解决幻读的

InnoDB 使用一种称为 Next-Key Locking 的锁机制来解决幻读问题。幻读发生在一个事务在读取某个范围内的记录时,另一个事务在这个范围内插入新的记录。InnoDB 的 Next-Key Locking 结合了行锁(Row Lock)和间隙锁(Gap Lock),确保在执行范围查询时能够锁定现有记录以及它们之间的间隙,从而防止其他事务在该范围内插入新的记录。

Next-Key Locking 机制

Next-Key Locking 是一种在索引记录上应用的锁机制,它锁住的并不仅仅是索引记录本身,还包括索引记录之间的间隙。这种机制可以防止其他事务在锁定的范围内插入新的记录。

具体例子

假设你有一个包含以下记录的表 employees

CREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(100)
);INSERT INTO employees (id, name) VALUES (1, 'Alice'), (3, 'Bob'), (5, 'Charlie');

在使用可重复读(REPEATABLE READ)隔离级别时,InnoDB 如何避免幻读?考虑以下两个事务:

  • 事务 A:执行一个范围查询。
  • 事务 B:在事务 A 的范围内插入新的记录。
事务 A
START TRANSACTION;
SELECT * FROM employees WHERE id BETWEEN 1 AND 5;

当事务 A 执行上述查询时,InnoDB 会对满足条件的所有记录(id=1, id=3, id=5)以及这些记录之间的间隙((1,3), (3,5), (5,∞))加锁。

事务 B
START TRANSACTION;
INSERT INTO employees (id, name) VALUES (2, 'David');

由于事务 A 已经锁定了 id 范围 [1,5] 及其间隙,所以事务 B 尝试在范围 [1,3] 的间隙中插入 id=2 的新记录时会被阻塞,直到事务 A 提交或回滚。

示例演示

创建表和插入数据
CREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(100)
);INSERT INTO employees (id, name) VALUES (1, 'Alice'), (3, 'Bob'), (5, 'Charlie');
事务 A
START TRANSACTION;
SELECT * FROM employees WHERE id BETWEEN 1 AND 5; -- Next-Key Locking 在索引记录及其间隙上加锁
事务 B
START TRANSACTION;
INSERT INTO employees (id, name) VALUES (2, 'David'); -- 此操作会被阻塞,直到事务 A 提交或回滚
提交事务 A
COMMIT; -- 提交事务 A 后,事务 B 可以继续执行

总结

InnoDB 使用 Next-Key Locking 机制通过结合行锁和间隙锁来解决幻读问题。当一个事务在执行范围查询时,InnoDB 会锁定查询结果集中的每一条记录以及这些记录之间的间隙。这确保了在范围内的任何插入操作都被阻塞,从而避免了幻读。

这种锁机制在可重复读(REPEATABLE READ)隔离级别下有效地避免了幻读,使得事务在读取范围内的数据时,不会因为其他事务的插入而读取到新的“幻影”记录。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MavLinK协议

由于在公司需要使用这个,我就写一个文章用于入门级别 简单介绍 MAVSDK是PX4开源团队贡献的基于mavlink通信协议的用于无人机应用开发的SDK,其可以部署在Windows、Linux、Android等多种平台,并且支持多种语言如c/c、python、Java等。 在官网…

GIS读研与求职准备:GNSS专业研0

本文介绍GIS方向研究生入学初期,为将来转码、从事开发类工作所作求职准备的规划路径、方向选择等方面的建议。 最近,有很多师弟师妹询问关于研究生方向选择、求职准备、就业方向选择等方面的问题。首先非常感谢大家的盲目信任(开个玩笑&#…

基于 debian 12 利用 kubeadm 部署 k8s 1.29 版本

基于 debian 12 利用 kubeadm 部署 k8s 1.29 版本 预先准备 准备三台debian 12的虚拟机,配置如下: HostnameIP配置k8s-master1192.168.31.604vCPU、8GiB 内存、50GiB 硬盘k8s-worker1192.168.31.614vCPU、8GiB 内存、50GiB 硬盘k8s-worker2192.168.31.6…

python从0开始学习(九)

前言 上一篇文章我们介绍了python中的序列类型和元组类型,本篇文章将接着往下将。 1、字典类型 字典类型是根据一个信息查找另一个信息的方式所构成的“键值对”,它表示索引用的键和对应的值构成的成对关系。它是一个可变数据类型,也就是说它…

Leetcode 3154. Find Number of Ways to Reach the K-th Stair

Leetcode 3154. Find Number of Ways to Reach the K-th Stair 1. 解题思路2. 代码实现 题目链接:3154. Find Number of Ways to Reach the K-th Stair 1. 解题思路 这一题思路上就是一个动态规划,我们只需要确定一下运行的终止条件,然后写…

React中显示数据

SX 会让你把标签放到 JavaScript 中。而大括号会让你 “回到” JavaScript 中&#xff0c;这样你就可以从你的代码中嵌入一些变量并展示给用户。例如&#xff0c;这将显示 user.name&#xff1a; return (<h1>{user.name}</h1> ); 你还可以将 JSX 属性 “转义到 …

《web应用技术》第9次课后作业

一、将前面的代码继续完善功能 1、采用XML映射文件的形式来映射sql语句&#xff1b; 2、采用动态sql语句的方式&#xff0c;实现条件查询的分页。 二、学习git的使用。 1、每个小组将自己的项目上传到gitee&#xff0c;学会协作开发&#xff1b; 2、学会从gitee上拉取项目…

【Text2SQL 经典模型】TypeSQL

论文&#xff1a;TypeSQL: Knowledge-Based Type-Aware Neural Text-to-SQL Generation ⭐⭐⭐ Code: TypeSQL | GitHub 一、论文速读 本论文是在 SQLNet 网络上做的改进&#xff0c;其思路也是先预先构建一个 SQL sketch&#xff0c;然后再填充 slots 从而生成 SQL。 论文发…

C++函数指针,键值对集合的学习

这段代码使用了 std::unordered_map 来存储 std::wstring 作为键&#xff08;key&#xff09;&#xff0c;而对应的值&#xff08;value&#xff09;是一个 std::function<void(std::array<int, 5>, SomeClass&, int)> 类型的函数指针。这个结构使得根据字符串…

C++ 时间处理-日期时间类

1. 关键词2. 问题3. 设计理念4. 支持的能力5. 代码实现 5.1. datetime.h5.2. timecount.cpp 6. 测试代码7. 运行结果8. 源码地址 1. 关键词 C 时间处理 日期时间类 跨平台 2. 问题 为什么C就没有一个方便好用的表示日期时间的类&#xff1f; 同样是高级语言&#xff0c;Ja…

2024 HGDD 荣耀开发者日·成都站

HGDD 荣耀开发者日成都站 活动时间&#xff1a;2024 年 5 月 27 日 活动地点&#xff1a;成都市双流区 LA CADIERE 蔚蓝湖滨城 期待与大家的见面&#xff01;

ISO 9001认证 要换版了!

ISO TC176/SC2 第50次会议2023年10月8日至13日在卢旺达基加利举行。 会议确定ISO 9001标准的修订从2024年1月开始&#xff0c;将包括WD&#xff08;Working Draft&#xff09;、CD&#xff08; Committee Draft&#xff09;、DIS&#xff08;Draft for International Standard&…

js+vue3+elementplus发送验证码实现(含倒计时重新发送)

<template><el-form :model"formValue" :rules"rules" ref"form"><el-form-item prop"phone"><el-input v-model.number"formValue.phone" class"form-input" placeholder"请输入手机号…

[matlab]yalmip国内源yalmip下载地址所有版本汇总

概述 MATLAB是一个强大的数值计算工具&#xff0c;用于数学建模、算法开发和数据分析。在MATLAB中&#xff0c;有很多工具箱可以帮助用户完成不同类型的任务。本文将介绍如何在MATLAB中安装Yalmip和Cplex&#xff0c;这两个工具箱可以帮助用户解决优化问题。 如果不想看文字描…

【oracle004】oracle内置函数手册总结(已更新)

1.熟悉、梳理、总结下oracle相关知识体系。 2.日常研发过程中使用较少&#xff0c;随着时间的推移&#xff0c;很快就忘得一干二净&#xff0c;所以梳理总结下&#xff0c;以备日常使用参考 3.欢迎批评指正&#xff0c;跪谢一键三连&#xff01; 总结源文件资源下载地址&#x…

RoctetMQ使用(2):在项目中使用

一、导入相关依赖 在项目中引入MQ客户端依赖&#xff0c;依赖版本最好和RocketMQ版本一致。 <!-- rocket客户端--><dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-client</artifactId><version&…

npm常用指令

基础 命令&#xff1a;run 解释&#xff1a;运行脚本 示例&#xff1a;npm run dev 命令&#xff1a;list || ls 解释&#xff1a;查看依赖列表 示例&#xff1a;npm list || npm ls 命令&#xff1a;install || i 解释&#xff1a;安装依赖 示例&#xff1a;npm install ||…

一文掌握python随机数random模块

目录 一、常用函数 1、 random.random() 2、random.uniform(a, b) 3、random.randint(a, b) 4、random.randrange(start, stop[, step]) 5、random.choice(sequence) 6、random.shuffle(x[, random]) 7、random.sample(population, k) 8、random.choices(population, w…

Qml:锚点

import QtQuick import QtQuick.WindowWindow {width: 800height: 600visible: truetitle: qsTr("Test Anchors")///锚点 上下左右Rectangle{id: anchor1width:200height: 150color:"#EEEEEE"Rectangle{id:rect1width:50height:50color: "red"Te…

Ubuntu 20/22 安装 Jenkins

1. 使用 apt 命令安装 Java Jenkins 作为一个 Java 应用程序&#xff0c;要求 Java 8 及更高版本&#xff0c;检查系统上是否安装了 Java。 sudo apt install -y openjdk-17-jre-headless安装完成后&#xff0c;再次验证 Java 是否已安装 java --version2. 通过官方存储库安…