MySQL:更新并发
MySQL: UPDATE Concurrency
我有一个包含两列的 table:item_id(int,auto inc)和 item_counter(int,默认值 0)
网页上的用户通过输入表单分配了一些项目。这运行:
SELECT * FROM itemtable WHERE item_counter<100 ORDER BY RAND() LIMIT 5
随后是更新查询,增加了每个项目的 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 但在该用户能够更新之前被其他用户更新。
我应该在这里使用concurrency/locking吗?
我不知道 InnoDB 的行级锁定是否是所有 UPDATE 操作所固有的,或者是否需要任何语法更改?。我想知道我应该在这里使用什么..或者根本不使用任何东西。
BEGIN;
SELECT ... FOR UPDATE; -- "FOR UPDATE" is the secret sauce.
UPDATE ...
COMMIT;
我有一个包含两列的 table:item_id(int,auto inc)和 item_counter(int,默认值 0)
网页上的用户通过输入表单分配了一些项目。这运行:
SELECT * FROM itemtable WHERE item_counter<100 ORDER BY RAND() LIMIT 5
随后是更新查询,增加了每个项目的 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 但在该用户能够更新之前被其他用户更新。
我应该在这里使用concurrency/locking吗? 我不知道 InnoDB 的行级锁定是否是所有 UPDATE 操作所固有的,或者是否需要任何语法更改?。我想知道我应该在这里使用什么..或者根本不使用任何东西。
BEGIN;
SELECT ... FOR UPDATE; -- "FOR UPDATE" is the secret sauce.
UPDATE ...
COMMIT;