我有一个包含gifts_count
和user_id
字段的用户表
我应该在下一条语句中添加锁吗(它可能来自许多线程)?
update users set gifts_count = gifts_count + 1 where users.user_id = user_id;
您最好的选择是使用事务而不是显式表锁定。
示例会话如下所示:
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;
该查询将挂起,直到您的事务被COMMIT
ed 或ROLLBACK
'd。