我正在创建一个网站,希望在其中添加标准MyISAM表中的计数器。
简化示例:
UPDATE votes SET num = num + 1;
如果多个连接都在执行相同的查询,这会引起问题吗,还是MySQL会照顾它并锁定表或其他东西以确保没有冲突?
MyISAM表使用表级别锁定。这意味着在执行更新查询期间,整个表将被锁定。因此,简化用例的答案是:是的,这是线程安全的。但是,如果您使用其他存储引擎,或者您的更新中包含多个表,则情况可能并非如此。
这是MySQL手册中的一句话,以更加清楚:
表锁定使许多会话可以同时从一个表读取,但是如果一个会话要写入表,则必须首先获得互斥访问。在更新期间,要访问此特定表的所有其他会话都必须等待,直到更新完成。
如果适合您的设计,您也可以考虑使用自动增量列,事务或外部同步。
干杯!