我有一个包含两列的表:item_id (int, auto inc) 和 item_counter (int, 默认值 0)
网页上的用户通过输入表单分配了一些项目。这运行:
SELECT * FROM itemtable WHERE item_counter<100 ORDER BY RAND() LIMIT 5
这之后是一个 UPDATE 查询,增加了每个项目的 item_counter。
UPDATE itemtable SET item_counter=item_counter + 1 WHERE item_id=:item_id
大约 20-50 个用户将同时执行此操作。
一个简单的应用程序。 1 个 SELECT 和 5 个 UPDATE 操作对于每个用户都是连续的,我希望 item_counter 是准确的(避免这种情况:一个 item_id 被选择为具有 item_counter 99 但在该用户能够更新它之前被其他用户更新。
我应该在这里使用并发/锁定吗? 我不知道 InnoDB 的行级锁定是否是所有 UPDATE 操作所固有的,或者是否需要任何语法更改?。我想知道我应该在这里使用什么..或者根本不使用任何东西。
最佳答案
BEGIN;
SELECT ... FOR UPDATE; -- "FOR UPDATE" is the secret sauce.
UPDATE ...
COMMIT;
关于MySQL:更新并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32657542/