我正在开发的应用程序中存在潜在的竞争状况,我想在查询中考虑和避免这种情况。
总结应用程序流程...
在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语法,但是我对哪一个最适合我的解决方案感到困惑。