gpt4 book ai didi

mysql - 这个更新,选择组合查询线程安全吗?

转载 作者:可可西里 更新时间:2023-11-01 07:35:01 25 4
gpt4 key购买 nike

我有一个名为 seats 的表,它具有这样的模式

id,taken

对于每个用户,我取一个随机的未被占用的 id 并分配给该用户,这里为了简单起见,我让 taken = 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;

此查询随机占用一个带有 taken 标志 null 的座位,并为该座位设置标志 1。虽然此查询工作正常,但此线程安全吗?

考虑这个场景,我同时有两个用户。对于 user1,我选择行 X,就在运行更新查询之前,user2 checkin ,对于该用户,选择查询返回与 user1 相同的行。所以我将结束更新同一行两次。

此查询是否可能出现这种情况?

最佳答案

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

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

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

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

虽然您的代码和您的问题都没有建议能够捕获更新的哪个 id,但您可以通过用户定义的变量捕获它:

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

select @id id;

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

关于mysql - 这个更新,选择组合查询线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27044768/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com