我正在开发一个积分系统,它会根据他们的积分为我的网站上的用户提供排名,每当有人检查他的个人资料页面时,我都会给用户+1分.假设用户有200分,在相同的时间内,10位用户检查了他的个人资料页面,根据我的理解,代码将获得200加1,如果10个用户同时进入,结果将是200 + 1 = 201 ,数据库将如何运作?
逻辑上它只计算一次访问,因为用户检查配置文件的时间值为200,所以当MYSQL更新发生时它总是201.我是否正确?
Mar*_*ers 24
如果选择现有的点数,请在客户端中添加一个点,然后将更新后的值写回数据库,然后就会出现竞争条件.正如您所指出的,某些观点可能不会被计算在内.
相反,您应该尝试使用原子更新并避免此问题:
UPDATE user SET points = points + 1 WHERE id = 42
Run Code Online (Sandbox Code Playgroud)
另一种方法是阅读SELECT ... FOR UPDATE.从文档:
如果对使用页锁或行锁的存储引擎使用FOR UPDATE,则查询检查的行将被写入锁定,直到当前事务结束.使用LOCK IN SHARE MODE设置一个共享锁,允许其他事务读取已检查的行,但不允许更新或删除它们.请参见第14.2.8.3节"SELECT ... FOR UPDATE和SELECT ... LOCK IN SHARE MODE锁定读取"
| 归档时间: |
|
| 查看次数: |
32081 次 |
| 最近记录: |