MySql-我什么时候应该使用锁

时间:2013-01-09 14:34:02

标签: mysql locking

我有一个包含gifts_countuser_id字段

的用户表

我应该为下一个语句添加锁(它可能来自多个线程)?

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

1 个答案:

答案 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;

该查询将暂停,直到您的交易为COMMITROLLBACK为止。