MySQL中的并发处理

时间:2012-08-15 18:48:04

标签: php mysql

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

UPDATE table SET field = field + 1

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

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

2 个答案:

答案 0 :(得分:6)

myisam引擎在执行事务之前总是锁定表,因此其他并发事务将被强制等待,直到完成此事务

答案 1 :(得分:4)

您的解决方案:

 UPDATE table SET field = field + 1

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

如果你只对该表进行短的写/读访问,一切都很好;如果并发命令需要访问它,它们将等待锁被释放然后执行。

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