2

像这样更新字段时,它将锁定该字段:

UPDATE table SET field = field + 1

由于这是计数器的一部分,预计会有一点负载,恐怕当多个用户访问我的站点时,并不是所有的计数都会被注册。

有没有更好的方法或解决方法?

4

2 回答 2

6

myisam 引擎在执行事务之前总是锁定表,所以其他并发事务将被迫等待直到这个完成

于 2012-08-15T18:50:51.167 回答
4

您的解决方案:

 UPDATE table SET field = field + 1

绝对完美。那是一条 SQL 语句,它完全执行而没有副作用或根本没有副作用。您还可以做的就是检查您的语句实际执行的天气。如果没有,您可以重试执行它。但没有真正的理由。你可以保持原样......在大多数情况下,当正确编写的语句失败时,还有另一个原因(如数据库过载),重试会使事情变得更糟。

如果您对该表只有短暂的写入/读取访问权限,那么一切都很好;如果并发命令需要访问它,它们将等到锁被释放后再执行。

仅当您在同一张表上执行耗时超过 1-2 秒的操作时。然后你可能会失去一些计数。等待获取锁的超时时间通常为 10 或 30 秒。如果进程只是手动锁定表(例如“LOCK 表”)并且不释放它,您也可能会丢失计数。这将是一个错误......其他 SQL 语句将无法获得锁,并最终将在较长的等待期后中止。

于 2012-08-15T18:56:10.533 回答