1

我有一个包含gifts_countuser_id字段的用户表

我应该在下一条语句中添加锁吗(它可能来自许多线程)?

update users set gifts_count = gifts_count + 1 where users.user_id = user_id;
4

1 回答 1

2

您最好的选择是使用事务而不是显式表锁定。

示例会话如下所示:

START TRANSACTION;
UPDATE `users` SET `gifts_count` = `gifts_count` + 1 WHERE `users`.`user_id` = user_id;
COMMIT;

如果需要(取决于您在做什么),您还可以在查询和 . 之间进行一些完整性检查COMMIT,如果出现问题,您可以随时使用ROLLBACK.


如果您想在更新时阻止对特定行的读取(如果使用InnoDB行级锁定),您可以在最后运行SELECT查询LOCK IN SHARE MODE,如下所示:

SELECT * FROM `users` `users`.`user_id` = user_id LOCK IN SHARE MODE;

该查询将挂起,直到您的事务被COMMITed 或ROLLBACK'd。

于 2013-01-09T14:36:46.777 回答