gpt4 book ai didi

mysql - 如何避免 MySQL 中的竞争条件

转载 作者:行者123 更新时间:2023-12-01 11:39:44 26 4
gpt4 key购买 nike

我正在开发的应用程序中存在潜在的竞争条件,我想在查询中考虑并避免这种情况。

总结申请流程...

  1. entries 表中新建一行:

    INSERT INTO entrys (name, email) VALUES ( 'Foo Bar', 'foo@example.com' );

  2. 通过检查时间敏感的 prizes 表来确定 Bar 先生是否获胜:

    SELECT id FROM prizes WHERE various_time_conditions = 'met' AND id NOT IN (SELECT prize_id FROM entries);

  3. 如果他是赢家,则相应地更新他的输入行:

    UPDATE 条目 SET prize_id = [prize id] WHERE id = [entry id];

由于每个奖品只能颁发一次,我需要消除竞争条件的任何可能性,在这种情况下,另一个进程可以查询奖品表并更新上述步骤 2 和 3 之间的条目表。

我一直在做一些研究,发现了大量关于事务的信息(我所有的表都使用 InnoDB)和使用 MySQL 的 SELECT ... FOR UPDATE 语法,但我很困惑这是最适合我的解决方案。

最佳答案

您将要锁定获奖记录。因此,如果您不打算使用 winner_id 之类的东西,请在奖品表上添加一些可用性标志(可能具有默认值)。像这样:

SELECT id FROM prizes WHERE ... AND available = 1 FOR UPDATE

如果您分配奖品,则设置可用性:

UPDATE prizes SET available = 0 WHERE id = ...

当然,您需要将其包装在事务中。

确保每次检查奖品是否可用时,您将AND available = 1 FOR UPDATE添加到查询中,因为SELECT 没有 FOR UPDATE 不会等待锁。

关于mysql - 如何避免 MySQL 中的竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22561241/

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