MySQL 通过在非索引列上执行删除语句时锁定整个表来尝试防止什么现象

2024-04-09

使用可重复读的 MySQL 隔离级别。

给定表test具有非索引列quantity:

id    |     quantity
--------------------
1     |      10
2     |      20
3     |      30

Tx1执行第一个,注意它还没有提交,这意味着所有获取的锁还没有释放。

Tx1:

START TRANSACTION;
DELETE FROM test WHERE quantity=10;

现在执行Tx2

Tx2:

START TRANSACTION;
INSERT INTO test(quantity) VALUES (40);
COMMIT;

对于 Tx2,我得到以下结果:

Lock wait timeout exceeded; try restarting transaction

我理解,作为quantity列没有索引,delete语句进行全表扫描,锁定所有行(无关紧要where条件匹配或不匹配),并且还在聚集索引中的每个索引记录之前和之后应用间隙锁,从而导致表完全阻塞insert来自 tx2 的语句无法获取要插入的行的锁。

来自 MySQLmanual https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html(对于可重复读隔离级别):

  • 对于具有唯一搜索条件的唯一索引,InnoDB 仅锁定找到的索引记录,而不锁定其之前的间隙。

  • 对于其他搜索条件,InnoDB 会锁定扫描的索引范围,使用间隙锁或下一个键锁来阻止其他会话插入该范围所覆盖的间隙(这在我的例子中使用)。

考虑到任何给定隔离级别中的锁定都用于防止phenomenas我有点困惑在这种情况下阻止整个表的原因是什么,我的意思是什么样的phenomena在这种情况下可以阻止整个表的阻塞吗?


默认情况下,InnoDB 使用一致快照Repeatable Read https://vladmihalcea.com/non-repeatable-read/隔离级别,这意味着您可以获得元组和范围的可重复读取。

即使 SQL 标准这么说Phantom Reads https://vladmihalcea.com/phantom-read/被阻止Serializable然后Repeatable Read可能无法阻止它。

有关间隙锁定如何工作的更多详细信息,请查看这篇文章由 Percona 撰写 https://www.percona.com/blog/2012/08/28/differences-between-read-committed-and-repeatable-read-transaction-isolation-levels/.

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

MySQL 通过在非索引列上执行删除语句时锁定整个表来尝试防止什么现象 的相关文章

  • MySQL #1093 - 您无法在 FROM 子句中指定用于更新的目标表“赠品”

    I tried UPDATE giveaways SET winner 1 WHERE ID SELECT MAX ID FROM giveaways 但它给出了 1093 您无法指定目标表 赠品 进行更新FROM clause 本文 ht
  • 使用 DBCP 配置 Tomcat

    在闲置一段时间 几个小时 后 我们收到了 CommunicationsException 来自 DBCP 错误消息 在异常中 位于这个问题的末尾 但我没有看到任何配置文件中定义的 wait timeout 我们应该看哪里 在 tomcat
  • 在PHP中,如何在表格中显示数组内容

    如果我在 MySQL 客户端中进行选择 我将得到如下所示的输出 mysql gt select FROM group LIMIT 2 group id group supergroup id group deletable group la
  • 无法删除数据库 mysql:错误 3664 (HY000)

    我的应用程序中有一个名为X Files 我想要drop它 但每当我运行命令时drop database X Files我收到以下错误 mysql gt drop database X Files ERROR 3664 HY000 Faile
  • 在数据库中存储密码的最佳方法[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Laravel:使用 Faker 播种多个独特的列

    介绍 怎么样 伙计们 我有一个关于模型工厂和多个独特列的问题 背景 我有一个名为 Image 的模型 该模型将语言支持存储在单独的模型中 图片文字 图片文字 has an image id栏 语言栏和文本栏 图片文字有一个约束MySQL那个
  • 如何修改 Amazon RDS 实例的 my.ini 参数

    在启动 MySQL 5 5 RDS 实例时 Amazon 使用默认参数组来配置 my ini 参数 但控制台不允许我修改它们 我怎样才能实现这个目标 例如默认将存储引擎设置为MyISAM或设置字符集 此处记录了这一点 http aws am
  • 日志中每天的每周活跃用户数

    我想知道是否有人可以帮助我使用一些 SQL 来返回两天或更长时间内登录到数据库表的唯一用户数量 让我们使用 7 天作为参考 我的日志表在每一行中包含时间戳 ts 和 user id 表示该用户当时的活动 以下查询返回此日志中的每日活跃用户数
  • MySQL 跨表计数(*) 查询帮助

    SELECT name COUNT AS count FROM t1 t2 WHERE t2 id t1 id GROUP BY t2 id 我想从 t1 获取名称以及 t2 中 id 与 t1 相同的行数 到目前为止我已经得到了上面的内容
  • 数据库级别的别名列名 [MySQL]

    别名 可能是错误的词 因为它是在将列 表名称作为查询中的其他名称引用的上下文中使用的 我感兴趣的是是否有一种方法可以在数据库中为列指定两个名称 如果我要打印这样的表格 它看起来会是这样的 mysql gt SELECT FROM User
  • 如何将“mysql source”命令与 mysql 变量一起使用?

    我需要从 mysql shell 执行一个基于如下条件的 SQL 文件 mysql gt 源 var 其中 var 包含文件名 这不可能 source是MySQL客户端程序在本地识别并执行的命令 变量存在于服务器上 因此客户端不知道什么 v
  • 退出 PHP 脚本后终止或停止 MySQL 查询

    我在工作中运行一个统计服务器 由于运行的查询量很大 该服务器有时会变得非常慢 我们的营销团队使用它作为主要统计工具 团队中的某些人有时会在脚本结束之前退出脚本 通过关闭浏览器或选项卡 同时 SQL 查询继续执行 当有人关闭或离开 PHP 脚
  • 具有多个主键的 SQLAlchemy 不会自动设置任何

    我有一个简单的表 class test Base tablename test id Column Integer primary key True title Column String def init self title self
  • 更新 SQLAlchemy 中的特定行

    我将 SQLAlchemy 与 python 一起使用 我想更新表中等于此查询的特定行 UPDATE User SET name user WHERE id 3 我通过 sql alchemy 编写了这段代码 但它不起作用 session
  • 如何根据条件删除结果以计算平均值

    我有下面的架构 对其的快速解释是 鲍勃评分为 5 5 詹姆斯评分 1 5 梅西百货评分高达 5 5 逻辑 如果我是 A 请查找我屏蔽的所有人 查阅所有电影评论 任何留下电影评论且 personA 已屏蔽的人 请将其从计算中删除 计算电影的平
  • 我应该如何审核 MySQL 表中的更改(使用 MySQL 4)?

    我被要求审核 MySQL 表中的任何 所有更改 有谁知道有什么工具可以帮助我做到这一点 还是我需要编写自己的解决方案 如果我编写自己的审计 我最初的想法是制作一个单独的表并在 PHP 代码中构建一系列更改 类似 fieldname1 gt
  • MySQL:所有表都正常,但仍然错误 1577(发现事件调度程序使用的系统表已损坏)

    从我的系统日志 mysql 1663 ERROR 1577 HY000 at line 1 Cannot proceed because system tables used by Event Scheduler were found da
  • 为什么我收到“无法进行二进制日志记录”的信息。在我的 MySQL 服务器上?

    当我今天启动 MySQL 服务器并尝试使用以下命令进行一些更改时用于 MySQL 的 Toad http www quest com toad for mysql 我收到此消息 MySQL 数据库错误 无法进行二进制日志记录 消息 交易级别
  • Riak 在 MapReduce 查询中失败。使用哪种配置?

    我正在与 riak riak js 结合开发一个 nodejs 应用程序 并遇到以下问题 运行此请求 db mapreduce add logs run 正确返回存储在存储桶日志中的所有 155 000 个项目及其 ID logs 1GXt
  • 使用 md5 加密的 PHP 和 Mysql 查询出现问题

    我使用普通的 php mysql 插入查询并使用 md5 加密密码 这是插入查询 sql mysql query INSERT INTO user username password role approved values usernam

随机推荐

  • numpy正半定警告

    在我正在编写的Python脚本中 我正在使用表达式模拟多元正态随机向量 np random multivariate normal np zeros dim obs y cov 我的脚本运行 但生成以下警告 RuntimeWarning c
  • html5/jquery后退按钮

    是否有一个库或一段代码可以使特定按钮充当正确的浏览器后退按钮 它将带您到之前加载的上一个页面 目前我只是指定href我假设的是之前加载的页面 但得出的结论是这不起作用 因为可以从不同的屏幕访问一个屏幕 是否有这样的示例 或者我是否需要创建自
  • Android:从另一个片段打开一个片段

    我是 Android 新手 这是我的第二个应用程序 我正在创建一个选项卡式活动 其中第一个片段具有用于创建新任务的表单 第二个片段具有所有已保存任务的列表 第三个片段将在从第二个片段的列表中选择时显示对任务的评论分段 第三个片段也应该像一个
  • 如何将 WSGI 中的首选编码设置为 UTF-8

    感觉这里有点疯狂 我已经使用 mod wsgi 设置了 Apache 但我无法使编码正常工作 我有 测试 mod wsgi 是否在守护进程模式下运行 read 格雷厄姆 邓普尔顿的博客文章 http blog dscpl com au 20
  • ReportLab 表的列跨越 PDF 页面上的所有行?

    我正在尝试按以下格式在 reportLab 中布局表格 该表是动态的并且可以有很多行 a b a a tTableStyle SPAN 1 0 1 1 如果表格适合一页 则工作正常 但如果表格分为几页 则崩溃 如果没有跨度 表格可以正常分割
  • 带有时态表的 Entity Framework Core 3.1 - 访问 SysStartTime 和 SysEndTime

    我已经基于 Microsoft SQL 文档创建了时态表使用默认历史表创建临时表 https learn microsoft com en us sql relational databases tables creating a syst
  • 将 Pylons 控制器作为单独的应用程序运行?

    我有一个 Pylons 应用程序 我想将一些逻辑移动到单独的批处理过程中 我一直在主应用程序下运行它进行测试 但它将在数据库中执行大量工作 我希望它是一个单独的进程 将在后台不断运行 主 pylons 应用程序会将作业提交到数据库中 新进程
  • 如何在 android 中构建支持旧 SDK 版本 (minSdkVersion) 的应用程序

    当通过向导创建新项目并给出错误时 那就太沮丧了 我只是使用 MinSdk 9 创建新项目以使应用程序在姜饼上运行 这给了我以下错误 Error Execution failed for task app processDebugManife
  • 如何让 Discord 机器人异步等待多条消息的反应?

    tl dr 我的机器人如何异步等待多条消息的反应 我正在向我的 Discord 机器人添加石头剪刀布 rps 命令 用户可以通过输入调用命令 rps以及一个可选参数 指定要玩的用户 rps TrebledJ 被调用时 机器人将直接向调用它的
  • nextjs 动态路由渲染内容不起作用

    我被这个问题困扰了很多天 我在用Next js https nextjs org 并有 3 页 页面 index js 页面 categories js 页面 类别 slug js The categories slug js正在使用Nex
  • 从 Hudson 运行 DUnit 测试

    我终于让 Hudson 构建了我的项目和相应的测试项目 使用 Embarcadero 论坛中提供的 XMLTestRunner2 单元 手动正确运行测试可执行文件会生成包含测试结果的 dunit report xml 文件 但我无法让 Hu
  • HashSet.contains 在不应该返回 false 时返回 false

    我有这个代码 public class Tray private Set
  • 将 Java 集合转换为 Scala 集合

    与堆栈溢出问题相关Scala 相当于 new HashSet Collection https stackoverflow com questions 674545 如何转换 Java 集合 java util List比如说 到 Scal
  • XSLT 身份转换

    我正在测试 XSLT 身份转换 因此我随机选择了 www w3schools com 上的以下示例 因为它允许我在线尝试 我将右侧窗格中的 XSLT 更改为身份转换
  • 毕加索库,Android:使用错误侦听器

    我正在使用毕加索库来加载图像 但遇到了一个问题 当图像加载失败时 我想隐藏视图而不是加载默认图像 我从源代码中注意到 添加侦听器的唯一方法似乎是来自构建器 但是当图像加载失败时 永远不会调用错误方法 有人对此有经验吗 iv ImageVie
  • Android imageview 从缩放图像中获取像素颜色

    我的家庭自动化应用程序有一个功能 人们可以将图像上传到手机 其中包含平面图和仪表板 他们可以使用它们来控制家庭自动化软件 我让他们上传两张图像 一张可见图像 其中包含他们想要显示的图形 第二张彩色图 其纯色对应于他们想要从可见图像中定位的区
  • 在opengl中,如何获得像素和gl.gltranslatef(floatx,y,z)之间的关系?

    我正在尝试在 Android 上学习 opengl 的东西 在 gl gltranslatef x y z 调用中 我将纹理沿 ve x 方向移动一些单位 但我无法找到 1 个 x 单位所属的像素数 这是我正在做的事情 我调用 gl glv
  • Simba Athena ODBC:无法使用 SQLGetPrivateProfileString 函数

    这很奇怪 我想设置从 RStudio 到我在 AWS Athena 中的实例的连接 我在用unixodbc作为驱动程序管理器 并通过使用测试连接成功isql v Simba Athena 但是 当我在 RStudio 中测试连接时 con
  • deviceready 事件未在 Angular 混合应用程序中触发

    我正在构建一个全平台 Angular 6 应用程序 该应用程序将用 Cordova 8 1 2 包装 不幸的是我无法制作设备就绪触发事件 我有两个独立的项目 一个用于 Angular 一个用于 Cordova 我可以使用以下命令构建 Ang
  • MySQL 通过在非索引列上执行删除语句时锁定整个表来尝试防止什么现象

    使用可重复读的 MySQL 隔离级别 给定表test具有非索引列quantity id quantity 1 10 2 20 3 30 Tx1执行第一个 注意它还没有提交 这意味着所有获取的锁还没有释放 Tx1 START TRANSACT