MySQL 幻象行
当同一个查询在不同的时间产生不同的行集时,就会出现所谓的幻像问题。例如,如果执行了两次SELECT,但是第二次返回了第一次没有返回的行,那么该行就是一个“幻象”行。
假设在表child的id列上有一个索引,你想读取并锁定表中标识符值大于100的所有行,并打算稍后更新所选行的某些列:
SELECT * FROM child WHERE id > 100 FOR UPDATE;
该查询从id大于100的第一个记录开始扫描索引。假设表包含id值为90和102的行。如果在扫描范围内的索引记录上设置的锁没有锁定在间隙(在本例中是90到102之间的间隙),另一个会话可以向表中插入一个id为101的新行。如果要在同一个事务中执行相同的SELECT,则会在查询返回的结果集中看到一个id为101的新行(“幻象”)。这就违反了事务的隔离原则。
为了防止出现幻象,InnoDB使用了一种名为next-key锁定的算法,它结合了索引行锁和间隙锁。InnoDB执行行级锁的方式是这样的:当它搜索或扫描一个表索引时,它会在遇到的索引记录上设置共享锁或排他锁。因此,行级锁实际上是索引记录锁。此外,索引记录上的next-key锁也会影响该索引记录之前的“间隙”。也就是说,next-key锁是索引记录锁加上索引记录之前的间隙锁。如果一个会话在一个索引中的记录R上有一个共享锁或排他锁,另一个会话不能在紧接在索引顺序中的R之前的间隙中插入新的索引记录。
当InnoDB扫描一个索引时,它也可以锁定索引中最后一条记录之后的间隙。就像在前面的例子中发生的那样:为了防止插入id大于100的表,InnoDB设置的锁包括id值102后面的间隙锁。
MySQL 幻象行的更多相关文章
- MySQL命令行登录的例子
环境:MySQL Sever 5.1 + MySQL命令行工具 问题:MySQL命令行登录 解决: 命令 行登录语法: mysql –u用户名 [–h主机名或者IP地址] –p密码 说明:用户名是你登 ...
- MySQL命令行下执行.sql脚本详解
本文主要介绍一个在MySQL命令行下执行脚本文件的例子,通过这个例子让我们来了解一下在命令行下MySQL是怎样执行脚本的吧.现在我们开始介绍这一过程. 1.首先编写sql脚本,保存为的:book.sq ...
- mysql命令行以及mysql workbence查询结果中文乱码的解决方法
最近正在学习mysql,安装环境是windows server 2003 32位操作系统+mysql 5.1.47同时也安装了mysql命令行以及mysql workbench这里是test数据库cr ...
- MySQL命令行导出数据库
MySQL命令行导出数据库:1,进入MySQL目录下的bin文件夹:cd MySQL中到bin文件夹的目录如我输入的命令行:cd C:\Program Files\MySQL\MySQL Server ...
- mysql命令行导入sql脚本中文变问号问题
之前一直用工具连接mysql虽然小问题不断也都无伤大雅,最近做金融云项目,只能通过服务器的内网访问数据库,也就是说只能在linux下通过命令行访问,在导入中文的时候发现都变成问号了,经过查询资料解决, ...
- 使用mysql 命令行,增加 ,删除 字段 并 设置默认值 及 非空
使用mysql 命令行,增加 ,删除 字段 并 设置默认值 及 非空 添加 alter table table_name add field_name field_type; 添加,并设置默认值,及非 ...
- mysql 命令行操作入门(详细讲解版)
之前分享过多次Mysql主题,今天继续分享mysql命令行入门 1. 那么多mysql客户端工具,为何要分享命令行操作? -快捷.简单.方便 -在没有客户端的情况下怎么办 -如果是mysql未开启 ...
- 关于mysql数据库行级锁的使用(一)
项目上一个业务需要对某条数据库记录加锁,使用的是mysql数据库 因此做了一个关于mysql数据库行级锁的例子做测试 package com.robert.RedisTest; import java ...
- Mysql InnoDB行锁实现方式(转)
Mysql InnoDB行锁实现方式 InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的.InnoDB这种行锁实现特点 ...
- Mysql InnoDB行锁实现方式
Mysql InnoDB行锁实现方式 InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的.InnoDB这种行锁实现特点 ...
随机推荐
- IDEA中无法调出中文输入法?
参考链接:idea写代码时无法切换到中文输入
- 【MicroPython] 用 c 添加接口 -- 添加 module
[来源]https://www.eemaker.com/micropython-add-module.html
- 【canvas】 绘制七巧板
效果图: 代码 : <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- [转帖]Nginx access log 按日期保存记录
https://cloud.tencent.com/developer/article/1958304 $time_iso8601 生成格式:2021-09-18T15:16:35+08:00 ...
- [转帖]资料整理——Oracle版本历史(很全面)(Releases and versions of Oracle Database)
资料来源: https://en.wikipedia.org/wiki/Oracle_Database Oracle Database Version Initial Release Version ...
- [转帖]【最佳实践】prometheus 监控 sql server (使用sql_exporter)
https://www.cnblogs.com/gered/p/13535212.html 目录 [0]核心参考 [简述] [1]安装配置 sql_exporter [1.1]下载解压 sql_exp ...
- [转帖]Rocksdb的优劣及应用场景分析
研究Rocksdb已经有七个月的时间了,这期间阅读了它的大部分代码,对底层存储引擎进行了适配,同时也做了大量的测试.在正式研究之前由于对其在本地存储引擎这个江湖地位的膜拜,把它想象的很完美,深入摸 ...
- 【转帖】ChatGPT重塑Windows!微软王炸更新:操作系统全面接入,Bing也能用插件了
https://cloud.tencent.com/developer/article/2291078?areaSource=&traceId= 金磊 丰色 西风 发自 凹非寺 量子位 | 公 ...
- [转帖]java启动jar包设置启动参数
目录 一.代码介绍 1.代码: 二.linux命令 1.命令 三.idea本地调试 1.找到Edit Configurations 2.修改Edit Configurations 参数 3.Edit ...
- 部署于K8S集群上面应用性能影响点推测
前言 本人2017年第一次接触K8S. 中间断断续续学习K8S相关的内容. 但是最近一年,几乎没太有学习. 因为之前学习了四五年, 一直以为产品马上要用 结果一直被浇冷水. 去年开始学乖了. 不这么搞 ...