MySQL Select...用于更新索引存在并发问题

2024-03-30

这是我上一个问题的后续问题(您可以跳过它,因为我在这篇文章中解释了该问题):
MySQL InnoDB SELECT...LIMIT 1 FOR UPDATE 与 UPDATE ...LIMIT 1 https://stackoverflow.com/questions/14039853/mysql-innodb-select-limit-1-for-update-vs-update-limit-1

环境:

  • Glassfish 上的 JSF 2.1
  • JPA 2.0 EclipseLink 和 JTA
  • MySQL 5.5 InnoDB 引擎

我有一张桌子:

CREATE TABLE v_ext (
  v_id INT NOT NULL AUTO_INCREMENT,
  product_id INT NOT NULL,
  code VARCHAR(20),
  username VARCHAR(30),
  PRIMARY KEY (v_id)
) ENGINE=InnoDB DEFAULT CHARSET=UTF8;

它填充了 20,000 条记录,如下所示 (product_id所有记录均为 54,code是随机生成的且唯一的,用户名设置为 NULL):

v_id     product_id    code                  username
-----------------------------------------------------
1        54            '20 alphanumerical'   NULL
...
20,000   54            '20 alphanumerical'   NULL

当用户购买产品54时,他从该表中获得一个代码。如果用户多次购买,则每次都会获得一个代码(对用户名没有唯一限制)。因为我正在准备一项高强度的活动,所以我想确保:

  • 不会发生并发/死锁
  • 性能不受所需锁定机制的影响

从SO问题(参见上面的链接)我发现做这样的查询更快:

START TRANSACTION;
SELECT v_id FROM v_ext WHERE username IS NULL LIMIT 1 FOR UPDATE;
// Use result for next query
UPDATE v_ext SET username=xxx WHERE v_id=...;
COMMIT;

但是,我仅在使用索引时才发现死锁问题username柱子。我认为添加索引会有助于加快一点速度,但它会在大约 19,970 条记录后产生死锁(实际上在这个行数上非常一致)。是否有一个原因?我不明白。谢谢。


从纯粹的理论角度来看,看起来您没有锁定正确的行(第一个语句中的条件与更新语句中的条件不同;此外,您只锁定了一行,因为LIMIT 1,而您稍后可能会更新更多行)。

尝试这个:

START TRANSACTION;
SELECT v_id FROM v_ext WHERE username IS NULL AND v_id=yyy FOR UPDATE;
UPDATE v_ext SET username=xxx WHERE v_id=yyy;
COMMIT;

[edit]

至于你陷入僵局的原因,这是可能的答案(从手册 http://dev.mysql.com/doc/refman/5.5/en/innodb-locks-set.html):

如果你没有适合你的语句的索引并且MySQL必须扫描 整个表来处理语句,表的每一行 被锁定 (...)

如果没有索引,则SELECT ... FOR UPDATE语句可能会锁定整个表,而使用索引时,它只会锁定某些行。由于您没有在第一个语句中锁定正确的行,因此在第二个语句期间会获取额外的锁。

显然,如果整个表被锁定(即没有索引),则不会发生死锁。 在第二个设置中肯定会发生死锁。

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

MySQL Select...用于更新索引存在并发问题 的相关文章

  • Android 应用程序和 MySql 连接无法连接。打开

    当我尝试打开连接时发生错误并显示 System TypeInitializationException MySql Data MySqlClient Replication ReplicationManager 的类型初始值设定项引发异常
  • mysql select sql 中的竞争条件

    我试图完成的事情看起来很简单 数据库类型 MyISAM表结构 card id status查询 从表中选择一个未使用的card id 并将该行设置为 已使用 当两个查询同时运行并且状态更新之前 相同的card id被获取两次 这是否是竞争条
  • MYSQL 从表中选择,获取表中最新/最后 10 行

    最好 最简单的方法是什么 我目前的查询是 SELECT FROM chat WHERE userID session AND toID friendID OR userID friendID AND toID session ORDER B
  • Spring boot JDBC无法连接docker容器中的mysql

    我正在尝试在两个单独的 docker 容器中运行 spring boot 应用程序 作为简单的 REST api 和 mysql 服务器 但是 我无法在 Spring 应用程序中获取 jdbc 连接来连接 mysql 它们都是独立工作的 当
  • Django 管理员 - 登录

    我正在建造一个Django Web App 与 Django Suit 用于管理界面 已经让 Python 2 7 Django 1 10 和 MySQL 和谐通信并启动了一个项目 python m django admin startpr
  • 这个 SQL DELETE FROM 语法有什么问题?

    我正在尝试删除 96k 记录 删除表 xoops bb posts text 页面中没有与 xoops bb posts 匹配的 post id 的所有记录 此查询返回 91k 条记录 SELECT FROM xoops bb posts
  • HTAccess - 令人困惑的干净网址

    如果我想简单地重定向 clients page to clients php view page我会使用像这样简单的东西 它效果很好 Options FollowSymlinks RewriteEngine on RewriteRule c
  • Java 从 SQL 数组获取 ResultSet 失败

    我试图从数据库中检索电子邮件地址 但没有成功 我的代码如下 Main System out println PortfolioData getEmails 58 So Far Returning null 投资组合数据 public sta
  • 通过我的java代码导出数据库

    我想使用我的 java 代码导出我的 MySQL 数据库 但我还没有找到任何办法 我想要做的就是我的应用程序中有一个按钮作为 导出数据库 单击该按钮时 我的数据库应导出到指定的路径 我使用了以下代码 但它不起作用 Runtime runti
  • 如果列有多个逗号分隔值,如何过滤 mysql 数据?

    我想问如果检查条件以查找具有多个逗号分隔值的列 如何过滤 mysql 数据 我给你举个例子 我有下表说 tbitems id item names item types item features 1 item 1 8 6 10 5 4 9
  • 使用mysql在一个查询中选择多个表中的子项总数

    我整个下午都在尝试处理一个查询 或两个或三个 以获得三个表的所有子表的计数 看看我的设计 用户表 id user name 1 foo 2 bar 赢表 id won user 1 1 2 1 3 2 绘制表格 id draw user 1
  • MySQL SELECT 输出同一行中每个 id 的下一个日期

    我查询的表结构如下 ID Date Before value After value 1 2014 04 25 Win Loss 1 2014 04 30 Loss Win 1 2014 08 18 Win Loss 1 2014 08 2
  • 如何使PHP中的激活链接过期?

    我有一个 php 脚本 它通过电子邮件向用户发送激活链接 以便他们可以激活他们的帐户 链接是这样的 mysite com activation phpid id 20 如何创建 24 小时后过期的链接 我还没有尝试过任何东西 因为我找不到任
  • MySQL 与 PHP 的连接无法正常工作

    这是我的情况 我正在尝试使用 Apache 服务器上的 PHP 文件连接到 MySQL 数据库 现在 当我从终端运行 PHP 时 我的 PHP 可以连接到 MySQL 数据库 使用 php f file php 但是当我从网页执行它时 它只
  • MySQL 按主键排序

    某些 SQL 服务器允许使用通用语句 例如ORDER BY PRIMARY KEY 我不相信这适用于 MySQL 是否有任何此类解决方法可以允许跨多个表自动选择 或者是否需要查找查询来确定主键 我一直在研究的解决方法包括调用SHOW COL
  • PHP 选择后立即删除

    我有一个 PHP 服务器脚本 它从 MySQL 数据库中选择一些数据 一旦我将 mysql query 和 mysql fetch assoc 的结果存储在我自己的局部变量中 我就想删除我刚刚选择的行 这种方法的问题在于 PHP 似乎对我的
  • 如何以最少的查询次数获取帖子列表和关联标签

    我的表格结构如下 标签 更多的是一个类别 id 标签名称 描述 slug POSTS ID 标题 网址 邮戳 id idPost idTag USERS ID 用户名 userSlug VOTES id idPost idUser 每个帖子
  • MySQL 存储过程将值分配给 select 语句中的多个变量

    这是我的存储过程 我在为声明的变量赋值时遇到问题 当我执行它时 插入和更新命令工作正常 但声明变量的值保持为 0 但我在数据库中有一些价值 我怎样才能正确地做到这一点 BEGIN DECLARE PaidFee INT DEFAULT 0
  • 对于数据库来说,选择正确的数据类型会影响性能吗?

    如果是这样 为什么 我的意思是 tinyint 的搜索速度比 int 快吗 如果是这样 性能上的实际差异是什么 是的 根据数据类型 它确实有所不同 int vs tinyint不会在速度上产生明显的差异 但会在数据大小上产生差异 假设tin
  • 为什么 MySQL 创建带有 _seq 后缀的表?

    我创建了一个 InnoDB 表 名为foo在 MySQL 中 一旦我对表执行插入操作 我就会看到另一个表foo seq被建造 如果我删除自动生成的表 它会在下一次插入后出现 是什么原因造成的 听起来像是正在创建一个序列 您是否有自动生成的主

随机推荐

  • 应用程序池回收如何影响 ASP Net 会话状态?

    我知道当应用程序池被回收时 会启动一个新的工作进程 但我对在此过程中如何处理过期和有效会话感到困惑 哪些传递给新的工作进程线程 哪些被消除 它将做什么 用户A的会话已过期 用户B的会话有效 回收后 当用户A和用户B请求时 他们的会话状态会是
  • Maven 属性加载顺序

    我知道 Maven 属性可以在不同的位置定义 m2 settings xml在本地机器上
  • 如果我只知道文件名的一部分,如何打开文件?

    我需要打开一个我不知道完整文件名的文件 我知道文件名是这样的 filename esy 我确信该文件在给定目录中只出现一次 filename esy已经是一个 shell Ready 通配符 如果情况总是如此 您可以简单地 const SO
  • Skylake 中干净缓存行的写回?

    我观察到 Skylake SP 在真实硬件上对干净的缓存行进行写回 Leeor 对这篇文章的回答对于 Intel Core i3 i7 数据从缓存集中逐出后的去向 https stackoverflow com questions 1941
  • RESTful API 根据用户角色不同的响应

    我使用 Laravel 作为我的 PHP 框架 这是一个约定index show store 控制器中的功能 我有两种类型的用户 管理员和普通用户 让我们假设有一个Order 在餐厅 模型 我想实施index其控制器的功能 一位用户可以有多
  • 窗格形状修改

    好吧 长话短说 我正在尝试创建一种聊天 消息系统 并且需要一点帮助 我正在尝试在容器上创建一个箭头 如下图所示 该图像是从 ControlsFX 及其 PopOver 窗口中取出的 我不能使用他们的弹出窗口小部件 因为它的行为与我使用它的目
  • 获取查询的运行时执行计划

    我有一个执行一些 sql 查询的应用程序 如何从 sqlplus 或其他 Oracle 客户端获取当前正在执行的查询的执行计划 如果有必要 我可以修改应用程序中使用的 oracle 会话 我不想使用explain plan并手动执行该查询
  • sql 中的希伯来语和其他语言

    我有 SQL Server 托管 客户端是移动应用程序 我的逻辑是用户创建数据并将其存储在服务器上 有些数据是文本 然而 用户可以输入英语 希伯来语或他的客户端支持的任何其他语言 我需要为表指定哪种排序规则才能支持所有语言 问候 约阿夫 您
  • Windows 调试工具未安装

    我正在尝试通过 Windows SDK 安装 Windows 调试工具 两次尝试后我不知道该怎么做 我开始安装 没有收到任何错误 但调试工具 windbg 和 kd 却找不到 日志几乎毫无用处 9 16 59 PM Monday July
  • AttributeError:“CharField”对象没有属性“model”

    models py file from django db import models class Stocks models Model symbol models CharField max length 20 unique True
  • 如何从语言代码中获取语言的全名? (例如:从“en”到“English”)

    我正在寻找与此问题 答案等效的 dart 从语言代码中获取该语言的语言名称 https stackoverflow com questions 36061116 get language name in that language from
  • 如何监控 Amazon S3 服务中对象的带宽?

    如何以编程方式监控AWS S3服务中对象的带宽 我想这样做是为了防止使用我们服务的客户过度使用带宽并导致我们的成本超出我们的承受能力 我们希望限制每个对象 1TB 的带宽 详细的使用情况报告仅针对每个存储桶 而不是每个对象 你能做的是启用日
  • Web2py:下载文件/显示图像

    我最近开始使用 Web2py 框架 我发现它非常好 然而 我现在遇到了一个 基本 问题 Context 我正在构建的网站是一个科学代码界面 人们填写表格并提交 然后 数据 写入共享文件夹内的文件中 由代码处理 在后台作为守护进程运行 代码与
  • IE10 Flexbox 宽度包含填充,导致溢出。 box-sizing: border-box 没有修复

    本例中的 LHS flex 子项具有 1em 填充 这将导致 RHS 溢出父项 div style display ms flexbox width 200px border 5px solid black div style paddin
  • 为什么要将新的 ArrayList 分配给 List 变量?

    我是java新手 当我浏览网上许多示例的代码时 我看到人们声明变量ArrayList简单地说List几乎在所有情况下 List
  • 贝叶斯网络与 R

    我正在尝试建立贝叶斯网络模型 但是我无法安装合适的软件包 尝试过gRain bnlearn and Rgraphviz用于绘图 我在 R 2 15 和 3 2 中尝试过 以下是错误消息 library gRain Loading requi
  • Jquery .click 不触发

    尝试在这里学习 JQuery 一开始非常简单 当我单击该按钮时 页面会重新加载 但什么也没有发生 这是我的 JS 这是我的html div class panel right div
  • Oracle 位和函数

    我对 oracle bitand 功能感到困惑 我知道它用于控制是否设置两位 但是 被设定的意义何在 何时以及为何使用它 如果你能给出一个基于真实例子的例子 我会很高兴 感谢您的回答 在二进制中 set 的意思是 值为 1 未设置 意味着
  • KnpSnappyBundle 和 Symfony 3.4:图像和/或 css 导致超时

    我已经在现有的 Symfony 3 4 项目上安装了 KnpSnappyBundle 我已经用 HTML 树枝测试了 PDF 生成器 仅包含文本 没有图像 没有 css 没有 js 它工作正常 然后我使用绝对 URL 添加 到树枝 图像和
  • MySQL Select...用于更新索引存在并发问题

    这是我上一个问题的后续问题 您可以跳过它 因为我在这篇文章中解释了该问题 MySQL InnoDB SELECT LIMIT 1 FOR UPDATE 与 UPDATE LIMIT 1 https stackoverflow com que