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



我有大约 500 个线程,带有并发工作的循环。我想在每个循环中增加一个计数器。

循环中的最后一行:

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

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

例如,counter为 50,两个线程正好同时拾取 50 并增加它,因此线程 1 更新counter为 51,线程 2 具有 51,再次更新counter 51。 因此,我们将错过一个增量。这可能吗?如果是,如何避免?

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

实际上这

是不可能的,因为这些是更新语句,将在事务中运行。

仅当您的事务包含两个或更多语句时,才需要锁定表。

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

相关内容

  • 没有找到相关文章

最新更新