我知道已经有一些关于此的帖子只是想知道使用它有多安全
UPDATE table SET field = field + 1 WHERE [...]
如果服务器延迟一秒钟怎么办?假设 2 个用户同时单击该页面,这会导致他们都将字段读取为相同的数字并且都将同一字段增加 1?我猜,因为它是 mysql,它有某种查询系统,一次做一个,但不确定这是否属实,只是假设这是真的。
在此示例中,读取和更新发生在同一语句中。语句是原子的(即您可以认为它们以事务方式运行),所以一切都很好。
更新语句是原子的。当您运行更新查询时,表(或带有 innodb 的行)被锁定。时期。如果两个用户单击“同时”,它将正确地增加该字段两次。
这是我使用的另一种方法(如果您有单独的查询并且不想不必要地锁定表):
而不是更新,只需插入另一个表(模式无关紧要),定期(不是太频繁)计算该表中的项目并基于该更新另一个表。如果表会变大,只需增加计数,然后删除条目。还允许您添加其他元数据,例如用于进一步分析的时间戳。