gpt4 book ai didi

mysql - MySQL 中的竞争条件 - 防止多次插入

转载 作者:行者123 更新时间:2023-11-29 22:37:57 25 4
gpt4 key购买 nike

假设我有以下情况:一个用户只能执行一项事件任务。

因此,如果我想为 id 2 的用户添加任务,我需要这样做:

SELECT * FROM tasks WHERE active=1 AND id_user = 2;

如果没有记录我可以做

INSERT INTO tasks(id_user, active) VALUES(2,1);

问题是:如果我将 select 和 insert 放入事务中(并使用 InnoDB),我可以确保用户不会创建 2 个事件任务吗?

上面的情况被简化了,但我被告知在 MySQL 备份期间(mysql 插入以某种方式由服务器排队)用户创建了许多不允许使用这样的代码的事件任务(我目前不知道事务是否被用过的)。根据“故事”,唯一可行的解​​决方案是使用队列(可能是 Beanstalkd)在完成另一个任务后运行任务。

所以问题是 - 是否有可能发生这样的事情,以及在这种情况下使用 MySQL 事务是否是可行的解决方案,或者可能应该使用其他解决方案?

编辑

这里的问题是我无法为列添加唯一键,我也无法更新记录。为了更准确起见,真实情况是:

表任务中有:

id - 主键,自动递增id_user - 用户的 ID开始日期end_date - 可空(如果任务未完成则设置为空)

一个用户只能有一项未完成的任务(end_date 为空),因此当某个用户至少有一项任务的日期为空时,无法为该用户创建新任务。但是,我正在旧数据库上进行操作,如果 end_date 设置为 null,则很可能有许多记录用于相同用途,因此我不能在这里使用唯一的,每次在插入之前我都需要先检查

SELECT * FROM tasks WHERE end_date IS NOT null AND id_user = 2

如果没有记录,那么我可以为用户创建新任务。

将来也很可能会添加更多此选择的条件,以便在创建新任务之前进行验证。

最佳答案

如果您有一个可以防止重复的 UNIQUE 索引,请执行以下操作:

INSERT IGNORE INTO tasks (id_user, active) VALUES (2,1)

这将忽略有关重复条目的警告。这具有仅添加记录一次的效果。

关于mysql - MySQL 中的竞争条件 - 防止多次插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29479068/

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