【发布时间】:2014-03-21 14:12:46
【问题描述】:
我正在开发的应用程序中存在潜在的竞争条件,我想在查询中考虑并避免这种情况。
总结应用流程...
-
在
entries表中创建一个新行:INSERT INTO entries ( name, email ) VALUES ( 'Foo Bar', 'foo@example.com' ); -
通过查看时间敏感的
prizes表了解 Bar 先生是否是赢家:SELECT id FROM prizes WHERE various_time_conditions = 'met' AND id NOT IN ( SELECT prize_id FROM entries ); -
如果他是赢家,相应地更新他的输入行:
UPDATE entries SET prize_id = [prize id] WHERE id = [entry id];
由于每个奖品只能发放一次,我需要消除竞争条件的任何可能性,即另一个进程可以在上述第 2 步和第 3 步之间查询奖品表并更新条目表。
我一直在做一些研究,发现了大量有关事务的信息(我所有的表都使用 InnoDB)并使用 MySQL 的 SELECT ... FOR UPDATE 语法,但我不知道哪个是最适合我的解决方案。
【问题讨论】:
-
将所有查询放在一个事务中以便快速保险。
标签: mysql sql transactions race-condition