如何锁定尚不存在的 InnoDB 行?

2024-01-12

如何保证我可以搜索数据库中是否存在用户名,然后将该用户名作为新行插入数据库中,而在用户名之间没有任何拦截SELECT and INSERT声明?

几乎就好像我锁定了不存在的行。我想用用户名锁定不存在的行"Foo",这样我现在就可以检查它是否存在于数据库中,如果不存在,则将其插入数据库,而不会造成任何中断。

我知道使用LOCK IN SHARE MODE and FOR UPDATE存在,但据我所知,这只适用于已经存在的行。我不知道在这种情况下该怎么办。


虽然上面的答案是正确的,因为 SELECT ... FOR UPDATE 将阻止并发会话/事务插入相同的记录,但这并不是全部事实。我目前正在与同样的问题作斗争,并得出结论,在这种情况下 SELECT ... FOR UPDATE 几乎没有用,原因如下:

并发事务/会话也可以对同一个记录/索引值执行 SELECT ... FOR UPDATE,MySQL 会很乐意立即接受(非阻塞)并且不会抛出错误。当然,一旦其他会话完成此操作,您的会话也无法再插入记录。您或其他会话/事务都不会获取有关情况的任何信息,并认为他们可以安全地插入记录,直到他们真正尝试这样做。尝试插入 then 会导致死锁或重复键错误,具体取决于具体情况。

换句话说, SELECT ... FOR UPDATE 会阻止其他会话插入相应的记录,但即使您执行 SELECT ... FOR UPDATE 并且未找到相应的记录,您也可能实际上无法插入该记录。恕我直言,这使得“先查询,然后插入”方法毫无用处。

问题的原因是MySQL没有提供任何方法really锁定不存在的记录。两个并发会话/事务可以同时锁定不存在的记录“用于更新”,这实际上不应该是可能的,并且这使得开发变得更加困难。

解决这个问题的唯一方法似乎是使用信号量表或在插入时锁定整个表。请参阅 MySQL 文档以获取有关锁定整个表或使用信号量表的更多参考。

只是我的2分钱...

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

如何锁定尚不存在的 InnoDB 行? 的相关文章

  • 未找到列:1054 未知列 laravel

    所以我尝试用 laravel 制作一个表单 但除了新版本之外 他们删除了表单 但我可以让它运行 所以这里是 Route post register function user new User user gt u n Input get u
  • Mysql2::错误:字符串值不正确

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

    你能告诉我什么吗MySqlBulkLoader的用途 在哪里以及如何使用它 一些例子也将不胜感激 请 MySQLBulkLoader是MySQL Connector Net类中的一个类 包装了MySQL语句LOAD DATA INFILE
  • 使用 KMS 的 AWS RDS 加密是否会影响性能?

    Amazon states https aws amazon com about aws whats new 2015 01 06 amazon rds encryption with kms mysql postgresql that 加
  • 对于特定用户 MySQL,查找同一表内的日期范围重叠

    我绝不是 MySQL 专家 所以我正在寻求有关此事的任何帮助 我需要执行一个简单的测试 原则上 我有这个 简化的 表 tableid userid car From To 1 1 Fiesta 2015 01 01 2015 01 31 2
  • MySQL:如何检索随机行或多个随机行?

    我有一个 MySQL 数据库表 用于存储照片的 URL 我需要从特定类型的数据库中提取 5 条随机记录 我可以像这样提取 5 条记录 SELECT Photos FROM Photos WHERE Photos Type ID 4 LIMI
  • 通过页面打开 mysql 连接是完全鲁莽的吗?

    当查询数据库时 是否会感到极度偏执 每次必须完成新查询时 我都会打开和关闭 mysql 连接 我担心 尤其是启用 ajax 的页面 这会导致性能大幅下降 我应该继续使用此方法 还是至少在每个页面 而不是每个查询 中打开和关闭连接一次 顺便说
  • PDO 和 IS NOT NULL 函数

    我是 PDO 新手 我想知道是否有相当于 mysql 语句的语句来检查参数是否不为空 例如 SELECT FROM table WHERE param IS NOT NULL 我试过这个 pdo gt prepare SELECT FROM
  • 使用 socket.io node.js 和传入消息的通知系统的架构实现和设计

    免责声明 我之前没有使用过node js 我以前没有使用过socket io 我正在考虑实现 Google Plus Facebook StackOverflow 风格的通知系统 我不是一个没有经验的开发人员 最终我会解决这个问题 但我只是
  • 如何使用 Laravel 查询生成器在 WHERE 条件周围添加括号

    我使用 Laravel 查询构建器根据用户的过滤器选择动态过滤数据 query DB table readings foreach selections as selection query gt orWhere id selection
  • 在没有条件的情况下,如何使查询不返回任何内容?

    相当简单 我有一对多 多对一关系 我想查询它 但是 当未提供任何 WHERE 子句信息时 我不希望返回任何结果 简单来说 如何使查询变得非贪婪 您可以添加一个始终为 false 的 where 子句 并附加您想要用 OR 提供的条件 sel
  • MySQL:错误 1215 (HY000):无法添加外键约束

    我读过了数据库系统概念 第六版 西尔伯沙茨 我将在 OS X 上的 MySQL 上实现第 2 章中所示的大学数据库系统 但我在创建表格时遇到了麻烦course 桌子department好像 mysql gt select from depa
  • 错误 1045 (28000) 用户“root”@“localhost”访问被拒绝(使用密码:YES)

    请原谅我是一个完全的初学者 我正在尝试使用 cmd 行登录到我在 Windows 计算机上使用 easyPHP 安装的第一个 mySQL 数据库 我将进入 mysql bin 并输入命令 mysql u root 为了登录 但我收到以下消息
  • 如何使用索引优化 InnoDB 上的 COUNT(*) 性能

    我有一个较大但狭窄的 InnoDB 表 有大约 9m 条记录 正在做count or count id 桌子上的速度非常慢 6秒以上 DROP TABLE IF EXISTS perf2 CREATE TABLE perf2 id int
  • SQL Select 使某个值仅出现一次

    对于那些一直在这个 Twitter 克隆上帮助我的人 谢谢你们 在您的帮助下 我已经成功地完成了大部分工作 现在终于完成了关注者功能的最后一步 现在 我有一个包含以下字段的数据集 用户名 推文 日期 数据示例可能如下所示 Username
  • MySQL 索引创建速度很慢(在 EC2 上)

    我有一张相当简单的桌子 requestparams requestid varchar 64 NOT NULL requestString text ENGINE MyISAM 使用 LOAD DATA 填充表后 我正在更改架构并将 req
  • PhpStorm Docker PHPUnit 数据库

    I setup https blog jetbrains com phpstorm 2016 11 docker remote interpreters PhpStorm PHP PHPUnit 与 Docker 我在 PhpStorm 数
  • 转储中的 MySQL 标志

    在查看 mySQL 转储时 我发现了一些东西并且想知道它们是什么 I see 50001 DROP TABLE IF EXISTS xxx 标志 50001 是什么 有它们含义的列表吗 它在 MySQL 的论坛 邮件列表上进行了讨论here
  • MySQL 周数和新年

    我现在正在开发的网站有一个仪表板 显示各个用户在前一周输入的数据 我使用简单的 WHERE 子句选择此数据 SELECT FROM table WHERE WEEK date 1 WEEK CURDATE 1 1 然而 新年即将到来 当用户
  • Perl:通过一次 MySQL 调用更新多行

    似乎这不可能 但嘿我不妨问一下 我可能是错的 想知道 perl 是否可以使用一个 MySQL 调用来更新多行 我正在使用 DBI 任何帮助或反馈将不胜感激 这可以通过 ASP 和 ASP net 在 MSSQL 中实现 所以想知道是否也可以

随机推荐

  • 接口和标头

    今天我遇到了 C 接口的概念 我有一个希望很简单的问题来看看我是否理解它们 它们与 C 头文件非常相似吗 我的意思是 根据我得到的信息 您定义了类的主干 但没有实际定义它的功能 这有点类似于标头 对吗 我阅读了整个 MSDN 定义 但它并没
  • Java循环效率

    我正在比较 Java 中嵌套的 for while 和 do while 循环的效率 并且遇到了一些奇怪的结果 需要帮助理解 public class Loops public static void main String args in
  • Python 中可处理大指数的贝塞尔函数

    我有一些代码使用一阶和二阶 iv 和 kv 的修改贝塞尔函数 令人烦恼的是 它们似乎有限制 即 iv 0 713 和 kv 0 697 分别加 1 分别得到无穷大和 0 这对我来说是一个问题 因为我需要使用高于此的值 通常高达 2000 或
  • 如何阻止文本被选择?

    在我的网络应用程序中 用户有时可以多次单击同一按钮 跳过消息和内容 从而导致被选中 那么如何使用 Javascript jQuery 来防止这种情况发生 你不需要为此编写脚本 这里是 css webkit touch callout non
  • 在 C# 中使用本地 DTD 文件验证 XML 文件时出现问题

    我正在尝试验证 XML 文件 我正在使用这个代码 XmlReaderSettings settings new XmlReaderSettings settings ProhibitDtd false settings Validation
  • Nodejs 和 php 生成的不同 HMAC

    base64 encode the binary result of the HMAC computation merchantSig base64 encode hash hmac sha256 signData pack H hmacK
  • 在 R 中生成数字

    在R中 如何生成N个平均值为X 中位数为Y 至少接近 的数字 或者更一般地说 是否有一个算法可以实现这一点 有无限多个解决方案 近似算法 生成低于中位数的 n 2 个数字 生成高于中位数的 n 2 个数字 添加您想要的中位数并检查 添加一个
  • 如何改变javafx中窗格的颜色?

    我想改变 a 的颜色Pane我得到的String来自用户 我该如何设置这个String作为我的窗格中的背景颜色 Code colorField setOnKeyTyped new EventHandler
  • 使用过多 JavaScript 有什么坏处?

    我想知道在网页中使用过多 JavaScript 代码有哪些缺点 例如 我将为我的下拉菜单 选项卡和折叠面板使用 jQuery 框架 以及用于我的日历的其他 JavaScript 尽管有可用的使用 jQuery 的日历 和用于其他内容的其他
  • KnockoutJs,第三方模板库,JsRender

    Knockout 与最新的 JsRender 版本兼容吗 template binding Daniel Knockout 的模板目前与 jsRender 不兼容 我尝试过 jsRender 模板引擎here http jsfiddle n
  • 将数据库放入android项目中

    我在 stackoverflow 上读到了大约 5 个线程 但仍然不知道该怎么做 我已经有 sqlite 数据库 但我不知道将它放在我的 android studio 项目中的哪里 我想要随应用程序一起下载数据库 它并不假装是最好的方法 但
  • Node.js 全局变量

    我在这里问 Node js 需要继承吗 https stackoverflow com questions 5348685 node js require inheritance 有人告诉我 我可以通过省略变量来将变量设置为全局范围 这对我
  • 如何在黑莓中使BrowserField的背景透明

    我在用BrowserField的组成部分RIM BB 它现在显示白色背景 我想要制作一个透明背景 这样它就可以与经理的背景颜色相匹配 我曾尝试使用下面的代码 但这不起作用 BrowserField contentField new Brow
  • 为什么字符串类型的默认值是null而不是空字符串?

    测试我所有的琴弦是很烦人的null在我可以安全地应用像这样的方法之前ToUpper StartWith etc 如果默认值为string如果是空字符串 我就不必测试 而且我觉得它与其他值类型更加一致 例如int or double例如 此外
  • Ansible jenkins_plugin 模块返回“HTTP 错误 403:请求中未包含有效的 crumb”

    我使用 Ansible v 2 8 作为 Packer 模板背后的配置程序来为 Jenkins 主节点构建 AMI 对于以前的版本 剧本已成功通过 然而 从 Jenkins 版本 2 176 3 开始 jenkins plugin模块一直在
  • 为什么spring找不到Spring Cloud Stream创建的@Source bean通道?

    我正在尝试使用 Spring Cloud Stream 来发布和使用 Kafka 消息 我一直在研究文档这里关于访问绑定通道 http docs spring io spring cloud stream docs Chelsea SR2
  • React-dnd getDecolatedComponentInstance() 不是一个函数

    我目前正在 React 中构建文件上传和排序功能 我使用了以下示例 https gaearon github io react dnd examples chessboard tutorial app html https gaearon
  • 根据距离聚合 sf 点

    当点在指定距离内时 我想创建 SpatialPointsDataFrame 的所有变量的平均值 我有一个方法可以做到这一点 但这似乎是解决问题的愚蠢方法 任何使用整洁的现代语法来做到这一点的想法将不胜感激 首先 我有一个SpatialPoi
  • 如何将此 MySQL SELECT 查询转换为 DELETE 查询?

    我想从数据库中删除某些项目 我有以下查询 SELECT FROM sheets entries WHERE entries sheetID sheets id AND sheets clientID 13 这有效 并返回 2 个结果 现在我
  • 如何锁定尚不存在的 InnoDB 行?

    如何保证我可以搜索数据库中是否存在用户名 然后将该用户名作为新行插入数据库中 而在用户名之间没有任何拦截SELECT and INSERT声明 几乎就好像我锁定了不存在的行 我想用用户名锁定不存在的行 Foo 这样我现在就可以检查它是否存在