停止使用MySQL InnoDB同时访问两行?

Stop two rows being accessed at the same time with MySQL InnoDB?

提问人:async life 提问时间:9/4/2020 更新时间:9/4/2020 访问量:37

问:

这是我之前问题的续集,它没有 100% 解决问题。在这里找到它

我有一个 InnoDB MySQL 数据库,可以从 10 - 20 个外部服务访问这个数据库。我注意到多个服务从表中拉入同一行,我怎样才能阻止这种情况发生?queue_items

以下是我在应用程序中获取队列项的方法,

dbConnection.SetQuery(@"
    SET @updated_id := 0;

    UPDATE `queue_items`
    SET `processed_at` = @processedAt, `worker_id` = @workerId, id = (@updated_id := id)
    WHERE `processed_at` IS NULL AND `completed_at` IS NULL AND `confirmed` = '1'" + (onlyPublic ? " AND `is_private` = '0'" : "") +
    @"ORDER BY id ASC LIMIT 1;

    SELECT @updated_id;");

然后,我使用第一个查询的结果进行查询,其值为 。SELECT WHERE ID@updated_id

原始查询,

SET @updated_id := 0;

UPDATE `queue_items`
SET `processed_at` = @processedAt, `worker_id` = @workerId, id = (@updated_id := id)
WHERE `processed_at` IS NULL AND `completed_at` IS NULL AND `confirmed` = '1' ORDER BY id ASC LIMIT 1;

SELECT @updated_id;
mysql innodb

评论

0赞 Barmar 9/4/2020
我怀疑您正在寻找的是 .FOR UPDATESELECT
2赞 Barmar 9/4/2020
这不会阻止其他进程读取该行,但在您提交事务之前,它们将无法更新该行。
0赞 Josh Hallow 9/4/2020
@Barmar因为它当时有效(或者我认为它确实有效)。它真正所做的只是减少了获取重复记录的机会。
0赞 Barmar 9/4/2020
我为第一个问题添加了答案。
2赞 Barmar 9/4/2020
我在上面错了。它确实会阻止他们读取该行,直到事务提交。

答: 暂无答案