当像这样更新字段时,它将锁定字段:
UPDATE table SET field = field + 1由于这是计数器的一部分,预计会有一些负载,我担心当多个用户访问我的网站时,并不是所有的计数都会被注册。
有没有更好的方法或解决办法呢?
发布于 2012-08-16 02:56:11
您的解决方案:
UPDATE table SET field = field + 1绝对完美。这是一条SQL语句,它被完全执行,没有副作用或者根本没有副作用。另外,您可以做的就是检查您的语句是否已实际执行。如果没有,您可以重试执行它。但这并没有真正的原因。你可以让它保持原样...在大多数情况下,当正确编写的语句失败时,还有另一个原因(如过载的DB),重试会使情况变得更糟。
如果对表只有很短的写/读访问,那么一切都很好;如果并发命令需要访问它,它们将等待,直到锁被释放,然后它们将执行。
仅当您在同一个表上执行耗时超过1-2秒的操作时。然后,您可能会丢失一些计数。等待获取锁的超时时间通常是10 / 30秒。如果进程只是手动锁定表(例如,"LOCK table"),并且不释放它。这可能是个bug。其他SQL语句将无法获得锁,并最终将在一段较长的等待时间后中止。
发布于 2012-08-16 02:50:51
myisam引擎总是在执行事务之前锁定表,因此其他并发事务将被强制等待,直到这个事务完成
https://stackoverflow.com/questions/11975265
复制相似问题