MySQL:更新并发

标签 mysql innodb mysql-5.5

我有一个包含两列的表: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/

相关文章:

java - 对于受影响的行,Mysql 总是返回 1

php - 使用 PHP 将一条 MySQL 语句转化为多个 PHP 变量

Mysql:多列索引,多列索引的顺序重要吗?

Python mysql游标关闭连接

mysql - 在InnoDB MySQL中刷新到磁盘之前,脏的数据库页面通常在内存中保留多长时间?

更新查询上的 MySQL 高 lock_time 导致服务器卡住

mysql - 处理 MySQL/InnoDB 中的死锁

mysql - 为什么 LEFT JOIN 和 GROUP BY 会影响性能?

MySql生成文件在/var/lib/mysql

mysql - 派生表和汇总的结果列宽度