此更新、选择组合查询线程安全吗?

2024-04-12

我有一张名为席位的桌子,其架构如下

id,taken

对于每个用户,我随机选取一个未采取的 id 并分配给该用户,这里为简单起见,我将采取 =1。我正在使用的查询

   update seats u inner join  (
        SELECT id from seats  
        where taken is null limit 1) s 
   on s.id = u.id set taken = 1;

该查询采用随机席位,且采取的标志为 null,并且对于该席位,它使标志为 1。虽然该查询工作正常,但该线程安全吗?

考虑这种情况,我有两个并行用户。对于 user1,我选择行 X,就在运行更新查询之前,user2 签入,并且对于该用户,选择查询返回与 user1 相同的行。所以我将结束更新同一行两次。

此查询可以实现这种情况吗?


使用 mysql,有一个简单的、几乎令人难以置信的解决方案:

update seats set taken = 1
where taken is null
limit 1

此语法将受更新过程影响的行数限制为 1,使用 mysql 对更新语法的特殊扩展来实现您的意图。

当然,作为官方支持的扩展,这是一个原子操作并且完全线程安全。

尽管您的代码和问题都表明无法捕获whichid 已更新,您可以通过用户定义的变量捕获它:

update seats set
taken = 1,
id = (@id := id)
where taken is null
limit 1;

select @id id;

从 select 返回的值要么是已更新的 id,要么是 null(如果没有更新行)。

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

此更新、选择组合查询线程安全吗? 的相关文章

随机推荐

  • Python urllib2 响应头

    我正在尝试提取 URL 请求的响应标头 当我使用firebug分析URL请求的响应输出时 它返回 Content Type text html 但是当我使用 python 代码时 urllib2 urlopen URL info 结果输出返
  • Jax-RS 中可选的 @PathParam

    我有一项服务 其中路径的最后一部分是可选的 用户都可以输入 mypath and mypath param1 我尝试使用正则表达式来过滤路径的最后部分 Path mypath param1 param1 我使用 RestEasy 作为我的
  • 使用 IF 语句时如何将 shell 命令拆分为多行?

    当命令是 shell 的一部分时 如何将命令拆分为多行if陈述 这有效 if fab fabfile deploy fabfile py forward agent disable known hosts deploy target the
  • 有没有优化 R 性能的文档? [复制]

    这个问题在这里已经有答案了 我对 R 相当陌生 令我印象深刻的一件事是它运行得相当慢 有没有优化R的文档 比如优化Python描述的很好here http wiki python org moin PythonSpeed Performan
  • 防止/禁用 Xcode 滚动导航

    每当我在故事板模式下使用 Xcode 时 我都会用触控板滚动 如果我向左滚动太远 Xcode 会将我带到我正在处理的最后一个 m h 文件 这太令人沮丧了 我不希望能够向左或向右滑动两根手指来在 Xcode 中导航 但我真的很喜欢 Safa
  • 将 .git 文件夹在工作树层次结构中向上移动

    昨天 我在 git 存储库上执行了其中一项操作 请参阅下面的代码片段 以便有效地将我的项目向上移动文件夹层次结构中的几个文件夹 这基本上列出了所有文件并向它们添加前缀文件夹名称并相应地更新索引 旧布局 Root Sublevel 1 Sub
  • 为什么我的应用没有在 Google Play 上显示?刚刚发布

    我只是第一次尝试发布我的应用程序 我完成了开发者控制台上的步骤 它现在显示 已发布 并带有绿色复选标记 在我点击 激活 和 发布 后 没有错误 然而 我尝试在手机 平板电脑和 Chrome 浏览器上的 Google Play 商店 称为 U
  • 将 PHP 多维数组返回到 Javascript/AJAX

    我的理解是 为了将复杂的 PHP 变量返回给 Javascript 应该通过 AJAX 和 json encode 来完成 有人能给我一个实际的例子 PHP 和 Javascript 代码 吗 假设我们在 PHP 中有一个两维数组 twoD
  • Firebase 字段名称会自动更改吗?

    你好 firebase 开始自动更改我的字段名称 这造成了一个大问题 我怎么解决这个问题 My Class public class TUser private String UserKey private String LicenceKe
  • C# 4 中会有通用属性吗? [关闭]

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

    我希望 Excel 在文件关闭时自动备份工作簿 而不提示用户 我在网上找到了下面的优秀代码 忘记源代码 但备份文件类型正在更改为我无法打开的 BAK 文件 我该如何解决这个问题 两个文件将位于同一文件夹中 备份应具有相同的文件名和 bak
  • 函数模板特化编译错误

    A hh template
  • 检索 ODBC 表并插入 SQL Server CE 数据库

    我有一个到数据库的 ODBC 连接 我需要其中的一个数据表 该表大约有 20 行和几千行数据 我打算将此表插入到我的本地 SQL Server CE 数据库中 以便进一步使用它 两种连接都经过测试并且可以工作 我的尝试是只插入一列以使事情变
  • 创建与 .accdb 访问文件的连接

    我已经上这门课几天了 现在正在网上搜索试图找到解决方案 我在这里尝试做的是使用扩展名连接到 Access 2010 数据库 accdb我已经成功连接到旧数据库的扩展 mdb但不是 accdb 我尝试卸载 Office 并重新安装 x64 版
  • Zend 反向匹配路由返回当前 URL

    我正在使用 Zend Framework 并尝试设置一些自定义路由 这些在调度期间似乎工作正常 但反向匹配根本不起作用 这些是我设置的路线 router gt addRoute category new Zend Controller Ro
  • 用于获取 netstat -s 统计信息的 Windows API [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在搜索一个 Windows API 它返回与 netstat s 相同的统计信息 您可以使用Get
  • 如何将以 HTML 编写的 SVG 保存为 SVG 文件? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 以下 SVG 代码写入 HTML 文
  • 只读可见目录的文件名

    我试图读取文件夹的文件名并将它们保存在数组列表中 但我在数组中得到了我不想要的不可见文件名 实际上我只想保存 txt 文件名 有谁知道在创建列表之前如何在代码中更改它 String pathLevel Users MaxRuizTagle
  • 如何在 Oracle PLSQL 中将数字的小数位数扩展到最少?

    我不知道如何选择以下内容 123 gt 123 00000 123 12 gt 123 12000 123 123456 gt 123 123456 我想将小数位数扩展到例如 5 位小数 最少 如果根本没有小数位 则应该有 5 个零 小数点
  • 此更新、选择组合查询线程安全吗?

    我有一张名为席位的桌子 其架构如下 id taken 对于每个用户 我随机选取一个未采取的 id 并分配给该用户 这里为简单起见 我将采取 1 我正在使用的查询 update seats u inner join SELECT id fro