我有一个包含gifts_count
和user_id
字段
我应该为下一个语句添加锁(它可能来自多个线程)?
update users set gifts_count = gifts_count + 1 where users.user_id = user_id;
答案 0 :(得分:2)
您最好的选择是使用transactions而非显式表格锁定。
示例会话看起来像这样:
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
或ROLLBACK
为止。