InnoDB SELECT ... FOR UPDATE 语句锁定表中的所有行

2024-01-01

MySQL 服务器版本 5.1.41,启用了 InnoDB 插件。我有以下三个发票表:invoices、invoice_components 和invoice_expenses。表发票有invoice_id 主键。发票_组件和发票_费用都链接到表发票,发票_id作为非唯一的外键(每张发票可以有多个组件和多个费用)。两个表都有该外键的 BTREE 索引。

我有以下交易:

交易1

START TRANSACTION; 
SELECT * FROM invoices WHERE invoice_id = 18 FOR UPDATE; 
SELECT * FROM invoice_components WHERE invoice = 18 FOR UPDATE; 
SELECT * FROM invoice_expenses WHERE invoice = 18 FOR UPDATE; 

第一个事务的一切正常,并且行被选择并锁定。

交易2

START TRANSACTION; 
SELECT * FROM invoices WHERE invoice_id = 19 FOR UPDATE; 
SELECT * FROM invoice_components WHERE invoice = 19 FOR UPDATE; 
SELECT * FROM invoice_expenses WHERE invoice = 19 FOR UPDATE; 

第二笔交易返回ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction对于第三个查询。

当我尝试选择...更新其他发票及其组成部分和费用时,也会发生同样的情况。似乎第一个事务已锁定invoice_expenses 表中的所有行。有什么想法为什么会发生这种情况吗?

附加信息

事务 2 在事务 1 的第三次查询之后开始。服务器上没有其他用户、连接或事务。

该问题发生在默认的 REPEATABLE READ 事务隔离级别中。它可以通过更改为 READ COMMITTED 级别来修复。这是一个解决方案,但它仍然无法解释为什么问题发生在invoice_expenses 而不是invoice_components。


我怀疑这与间隙锁 and 下一个钥匙锁以及行为上的差异可重复读取 :

摘录自 MySQL 文档:设置事务语法 http://dev.mysql.com/doc/refman/5.1/en/set-transaction.html

对于锁定读取(使用 FOR UPDATE 或 LOCK IN SHARE MODE 的 SELECT)、UPDATE 和 DELETE 语句,锁定取决于该语句是使用具有唯一搜索条件的唯一索引,还是使用范围类型搜索条件。对于具有唯一搜索条件的唯一索引,InnoDB 仅锁定找到的索引记录,而不锁定其之前的间隙。对于其他搜索条件,InnoDB 锁定扫描的索引范围,使用间隙锁或下一个键(间隙加索引记录)锁阻止其他会话插入该范围所覆盖的间隙。

and 已提交读 :

注意:在MySQL 5.1中,如果使用READ COMMITTED隔离级别或者启用了innodb_locks_unsafe_for_binlog系统变量,InnoDB 没有间隙锁定外键约束检查和重复键检查除外。还,释放不匹配行的记录锁MySQL 评估 WHERE 条件后。

也许OP可以告诉我们现状innodb_locks_unsafe_for_binlog system变量,并且当该变量的设置更改时是否发生相同的锁定。

另外,如果相同的锁定发生在不连续的 id 上,例如18 and 20, or 18 and 99

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

InnoDB SELECT ... FOR UPDATE 语句锁定表中的所有行 的相关文章

  • 如何抑制输出并检查命令是否成功?

    我正在尝试编写一个 powershell 脚本来测试 MySQL 登录是否成功 检查是否发生错误 我还想抑制命令的所有输出 成功或不成功 这些是我尝试过的事情 mysql u root password mypass e show data
  • Mysql2::错误:字符串值不正确

    我有一个在生产模式下运行的 Rails 应用程序 但是今天当用户尝试保存记录时突然出现此错误 Mysql2 Error Incorrect string value 更多详细信息 来自生产日志 Parameters utf8 gt lt 9
  • MySqlBulkLoader 说明

    你能告诉我什么吗MySqlBulkLoader的用途 在哪里以及如何使用它 一些例子也将不胜感激 请 MySQLBulkLoader是MySQL Connector Net类中的一个类 包装了MySQL语句LOAD DATA INFILE
  • 在 PHP MySQL 中使用 jQuery AJAX 提交表单而无需重新加载

    我有一个基本的注册 登录页面 它使用 php 将数据提交到 SQL 数据库 但是 我希望页面在 jQuery AJAX 的帮助下不要在提交时重定向 无论成功与否 这是我目前所拥有的 但不起作用 它不显示任何错误消息 HTML 注册 html
  • 每次使用 COUNT() 函数,还是存储该值并将其加一?

    我有一个带有用户 投票 表和 用户 表的数据库 我认为数据库会在短时间内变得相当大 所以我想使用最有效的方法 我想我可以每次使用 投票 表中的 WHERE 语句来 COUNT 投票数 或者我可以将分数存储在 用户 表中 每次投票时将其增加
  • CSV 损坏,如何修复?

    我正在尝试解析 CSV 我想将它放入数据库或只是用 JavaScript 解析它 但由于语法损坏 任何一种方法都会失败 我的整个 CSV 文件在这里 https gist github com 1023560 https gist gith
  • MySQL 5.0 索引 - 唯一索引与非唯一索引

    MySQL 唯一索引和非唯一索引在性能方面有什么区别 假设我想在 2 列的组合上创建索引 并且该组合是唯一的 但我创建了一个非唯一索引 这会对 MySQL 使用的性能或内存产生重大影响吗 同样的问题 有区别吗primary钥匙和unique
  • MySQL使用BLOB的二进制存储VS OS文件系统:大文件、大数量、大问题

    我正在运行的版本 基本上 最新的一切 PHP 5 3 1MySQL 5 1 41阿帕奇 2 2 14操作系统 CentOS 最新 情况是这样的 我有数千个非常重要的文档 从客户合同到语音签名 客户对合同的授权录音 文件类型包括但不限于jpg
  • MySQL存储过程错误意外字符“:”

    我有以下语句来创建存储过程 但我不断收到 位置 835 处出现意外字符 错误 语句中唯一的冒号位于 start loop 循环中 为什么我会收到此错误以及如何修复 DELIMITER CREATE DEFINER root localhos
  • SQL Server 与 MySQL:CONTAINS(*,'FORMSOF(THESAURUS,word)')

    我很震惊 当我在 SQL Server 中看到查询非常简单时 我花了 3 4 天弄清楚如何在 mysql 中实现词干提取 和同义词搜索 Select from tab where CONTAINS FORMSOF THESAURUS wor
  • MongoDB 聚合查询与 MySQL SELECT field1 FROM 表

    我对 MongoDB 完全陌生 想要比较 NoSQL 数据模型相对于关系数据库对应部分的查询性能 我将其写入 MongoDB shell Make 10 businesses Each business has 10 locations E
  • MySQL 索引创建速度很慢(在 EC2 上)

    我有一张相当简单的桌子 requestparams requestid varchar 64 NOT NULL requestString text ENGINE MyISAM 使用 LOAD DATA 填充表后 我正在更改架构并将 req
  • MySQL 相当于 ORACLES 的rank()

    Oracle 有 2 个函数 rank 和dense rank 我发现它们对于某些应用程序非常有用 我现在正在 mysql 中做一些事情 想知道他们是否有与这些相同的东西 没有什么直接等效的 但你可以用一些 不是非常有效的 自连接来伪造它
  • MySQL 中复制一条记录

    我有一个表 我想复制表中的特定行 我知道这不是最好的方法 但我们正在寻找快速解决方案 这比我最初想象的要难 我需要做的就是将整个记录复制到 MySql 中自动增量表中的新记录 而不需要指定每个字段 这是因为该表将来可能会发生变化 并且可能会
  • MySQL 查询 - 使用 ORDER BY rand( ) 强制区分大小写

    是否可以强制查询区分大小写 我的听起来是这样的 SELECT g path FROM glyphs WHERE g glyph g glyph ORDER BY rand 如果 g glyph r 结果可以是 R 或 r 这不是我所期望的
  • 将数组内爆为来自 mysql 查询的逗号分隔字符串

    在过去的 1 1 2 天里 我一直在尝试将 16 行 id 存储到一个字符串中 并用逗号分隔每个 id 我得到的数组来自 MySQL 我得到的错误是 implode 函数 传递了无效参数 str array string while row
  • 如何在 mysql 正则表达式中匹配大写 ÅäÖ

    当我在 MySQL 中进行 REGEXP 比较时 我得到了瑞典字符大写版本的一些奇怪结果 我正在使用 utf8 swedish ci 排序规则 我想查找大写单词 SELECT ster REGEXP BINARY A Z a z 应该返回
  • 如何在应用程序级别管理只读数据库连接

    我们使用的是Java Spring Ibatis MySql 有没有办法利用这些技术在应用程序级别管理只读连接 我希望在只读 MySql 用户的基础上添加额外的保护层 如果 BasicDataSource 或 SqlMapClientTem
  • 用户登录时如何更新updated_at列?

    我正在尝试更新updated at每次用户登录时 列到当前时间 但我收到以下错误 InvalidArgumentException 找不到四位数年份 数据丢失 PHP input Input all remember Input has r
  • 发送 QUERY 数据包时出错。 PID=9565

    我有两个不同的环境开发和生活几乎都是相同的 但上述 标题中 警告仅在开发模式下发生 在此警告之前 我还收到错误消息 允许的内存大小 268435456 字节已耗尽 这仅发生在开发模式下 使用 PHP 版本 5 6 和 mysql 不是 my

随机推荐

  • 使用Python提取目录中所有pdf文档的页数

    我正在尝试使用 PyPDF2 来获取目录中每个 pdf 的页数 我可以使用 getNumPages 查找一个 pdf 文件中的页数 但我需要遍历一个目录并获取每个文件的页数 有任何想法吗 这是我到目前为止的代码 import pandas
  • 在 Bootstrap 3 中创建基础风格的块网格?

    在 Zurb Foundation 3 中 它们有一个 块网格 的 CSS 构造 它是一个无序列表 您可以在其中指定一行中的项目数 这是他们的文档 http foundation zurb com docs components block
  • 文件名中带有空格的 sqlcmd 脚本

    我有一个简单的SQLCMD脚本包含如下几行 Load data into Exampletable BULK INSERT dbo Example NOTE I ve tried single AND double quotes here
  • c# - 有没有办法制作固定(高度/宽度)控制台?

    我一直在 microsoft Visual Studio 2013 中闲逛 我制作了一个控制台应用程序 但我想知道是否有一种方法可以为其设置固定大小 高度 宽度 这意味着它无法调整大小 如果有人知道这是否可行 如果您能帮助我 我将不胜感激
  • 在 java 8 中将字符串转换为 Map

    有人可以指导我如何使用 Java 8 实现以下目标吗 我不知道如何将该计数器作为密钥 String str abcd Map
  • 如何将附加参数传递给 TypeScript 中的属性装饰器?

    我有一个简单的类 它的属性有物业装饰师 https github com Microsoft TypeScript Handbook blob master pages Decorators md property decorators应用
  • jQuery 根据复选框验证不同的字段

    我正在尝试使用jQuery 验证插件 http jqueryvalidation org 验证我的一份申请中的表格 表格 简化 如下
  • 如何在 tkinter 中创建模式对话框?

    我有一个运行一些嵌入式 Python 脚本的 MFC 应用程序 我正在尝试使该嵌入脚本创建模式的对话框之一 但我没有取得太大成功 谁能指出我制作模式对话框的方法 我是否需要为此使用 Windows 函数 还是仅 Tk 或 Python 函数
  • 如何在水晶报表中合并行?

    我正在使用 Crystal Report Version 10 2 Visual Studio 2008 并在 Crystal Report 中显示存储过程的结果 我的存储过程返回输出 如下所示 但我想在报告中显示 如下所示 提前致谢 使用
  • 如何在 div #content 加载时显示 div #loading

    我想实施一个解决方案 当 div content 中的内容正在加载时 隐藏 div content 显示 div loading 然后当 div content 加载完毕后 隐藏div loading 淡入 div content 我努力了
  • Vim - 在重音字母或 ñ 之后插入额外空格

    我有一个关于 Vim 的问题 我在 Mac OS X Snow Leopard 上并编译了 vim 以开始使用编辑器 有时我会用其他语言打字 我发现在输入带重音的字母时 每个字母后都会添加一个额外的空格 我还使用 Mac 西班牙语键盘进行打
  • 我尝试使用动画来使线性布局进行翻译,像这样向左<->向右。但我遇到了一些错误

    这是我的第一个应用程序 我尝试从右到左或从左到右翻译 这是代码 资源 gt 动画 gt 向左翻译
  • Node.js 和 java 之间的 mqtt 通信

    目标是使用 mqtt 协议发送数据 Java 项目 tempSensor 使用 mqtt 协议和使用 mqtt 订阅 tempvalue 的 Node js 生成 tempvalue Node js 和 java 项目都使用相同的密钥进行发
  • 如何在 iOS 中使用 MpMoviePlayerController 在 UISlider 上显示缓冲数据?

    我在用MPMoviePlayerController播放音频 我想在滑块上显示缓冲数据 如下所示 我想显示缓冲区数据 如滑块中的红色部分 我尝试用谷歌搜索它 但我没有得到任何解决方案 以及如何自定义滑块 提前致谢 是的 我们可以使用显示流数
  • 继承树上的反序列化顺序

    我有一个标记的基类Serializable 以及标记的派生类Serializable也 我想在反序列化期间在基类中做一些事情 因此声明了一个标记为OnDeserializing 但重要的是该方法将在任何派生类的之前执行OnDeseriali
  • 调整位图大小是在视图中裁剪而不是缩放

    我不知道如何调整位图的大小 根据这里的帖子 Bitmap createScaledBitmap 是执行此操作的方法 但它对我来说不起作用 由于视图的性质 我在 onDraw 中完成所有操作 因此我认为我不能使用布局或 ImageView 这
  • Three.js 具有恒定大小的对象

    我正在开发一个绘图程序 我需要的是一个具有恒定大小的 THREE Object3D 元素 就像线条始终为 1px 一样 换句话说 我试图在舞台上放置一个对于观看者来说尺寸始终相同的对象 所以如果你靠近它 它的大小不会改变 类似的机制是三线
  • 以下 Fortran“并发”循环有效吗?

    我不认为下面的do concurrentFortran 循环有效 如下所示acc在每次迭代中都会被修改 但是 gfortran 没有给我任何类型的警告 并且结果值acc正确的是 55 它是否有效 integer acc i acc 0 do
  • 使用 JavaScript 提取 EXIF 数据

    我正在评估使用 Canvas 的移动网络应用程序的图像上传技术 症结在于客户端读取 EXIF 数据 本网站的其他讨论 https stackoverflow com questions 7584794 accessing jpeg exif
  • InnoDB SELECT ... FOR UPDATE 语句锁定表中的所有行

    MySQL 服务器版本 5 1 41 启用了 InnoDB 插件 我有以下三个发票表 invoices invoice components 和invoice expenses 表发票有invoice id 主键 发票 组件和发票 费用都链