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