在并发时增加相同的计数器

时间:2014-11-14 09:11:01

标签: mysql concurrent-programming

我有大约500个带有循环的线程同时工作。我想在每个循环上增加一个计数器。

循环中的最后一行:

update counter_tbl set counter=counter+1 where id = 5;

是否有可能至少两个线程拾取一个counter的值并将其增加到相同的值?

例如,counter为50,两个线程同时完全拾取50并增加它,因此thread1将counter更新为51,将thread2更新为51,将counter更新为51再次。所以我们会错过一个增量。这可能吗?如果是,如何避免它?

我可以使用LOCK TABLE,但由于它的成本,我想避免它。

2 个答案:

答案 0 :(得分:0)

实际上这是不可能的,因为这些是更新语句并且会在事务中运行。

如果您的交易包含两个以上的报表,则只需要锁定表。

答案 1 :(得分:0)

您不必使用LOCK TABLE。数据库服务器按事务一致。在这种情况下,您的查询是一个事务,当两个线程尝试更新同一记录时,数据库服务器将处理该concurency。如果可能,事务将按到达顺序(或服务器确定的任何顺序)执行,如果不是,将发生死锁(在这种情况下,您可以安全地重新发送特定方案中的事务)。