1

我知道已经有一些关于此的帖子只是想知道使用它有多安全

UPDATE table SET field = field + 1 WHERE [...]

如果服务器延迟一秒钟怎么办?假设 2 个用户同时单击该页面,这会导致他们都将字段读取为相同的数字并且都将同一字段增加 1?我猜,因为它是 mysql,它有某种查询系统,一次做一个,但不确定这是否属实,只是假设这是真的。

4

3 回答 3

4

在此示例中,读取和更新发生在同一语句中。语句是原子的(即您可以认为它们以事务方式运行),所以一切都很好。

于 2012-10-20T00:53:17.787 回答
2

更新语句是原子的。当您运行更新查询时,表(或带有 innodb 的行)被锁定。时期。如果两个用户单击“同时”,它将正确地增加该字段两次。

于 2012-10-20T00:52:37.520 回答
0

这是我使用的另一种方法(如果您有单独的查询并且不想不必要地锁定表):

而不是更新,只需插入另一个表(模式无关紧要),定期(不是太频繁)计算该表中的项目并基于该更新另一个表。如果表会变大,只需增加计数,然后删除条目。还允许您添加其他元数据,例如用于进一步分析的时间戳。

于 2012-10-20T01:01:18.697 回答