当像这样更新字段时,它将锁定字段:
UPDATE table SET field = field + 1
由于这是一个预计会有一点负载的计数器的一部分,我担心当多个用户访问我的网站时,并非所有计数都会被注册。
有更好的方法或解决方法吗?
答案 0 :(得分:6)
myisam引擎在执行事务之前总是锁定表,因此其他并发事务将被强制等待,直到完成此事务
答案 1 :(得分:4)
您的解决方案:
UPDATE table SET field = field + 1
绝对完美。这是一个单独的SQL语句,完全执行时没有副作用或根本没有。你还可以做的就是,检查你的陈述实际执行的天气。如果没有,您可以重试执行它。但没有真正的理由。您可以将其保留原样...在大多数情况下,如果正确编写的语句失败,还有另一个原因(如数据库过载),重试会使事情变得更糟。
如果你只对该表进行短的写/读访问,一切都很好;如果并发命令需要访问它,它们将等待锁被释放然后执行。
只有在同一个表上执行操作的时间超过1-2秒才会执行。然后你可能会失去一些计数。等待获取锁定的超时通常是10秒30秒。如果进程只是手动锁定表(例如“LOCK表”)并且不释放它,您也可能会丢失计数。这将是一个错误......其他SQL语句无法获取锁定,最终会在更长的等待时间后中止。