如何在mysql中添加一个数字到当前值(同时多次)?

时间:2012-11-06 11:28:41

标签: php mysql

我正在开发一个积分系统,可以根据他们的积分为我网站上的用户提供排名,每当有人检查他的个人资料页面时,我都会给用户+1分。假设用户有200分,在相同的时间内,10位用户检查了他的个人资料页面,根据我的理解,代码将获得200加1,如果10个用户同时进入,结果将是200 + 1 = 201 ,数据库将如何行动?

逻辑上它只计算一次访问,因为用户检查配置文件的时间值是200,所以当MYSQL更新发生时,它总是201.我是否正确?

1 个答案:

答案 0 :(得分:22)

如果您选择现有的点数,请在客户端中添加一个点,然后将更新的值写回数据库,然后您有一个race condition。正如您所指出的那样,某些观点可能不会被计算在内。

相反,你应该尝试使用原子更新并避免问题:

UPDATE user SET points = points + 1 WHERE id = 42

另一种方法是使用SELECT ... FOR UPDATE阅读。来自documentation

  

如果对使用页锁或行锁的存储引擎使用FOR UPDATE,则查询检查的行将被写入锁定,直到当前事务结束。使用LOCK IN SHARE MODE设置共享锁,允许其他事务读取已检查的行,但不允许更新或删除它们。请参见第14.2.8.3节“SELECT ... FOR UPDATE和SELECT ... LOCK in SHARE MODE锁定读取”