我有大约500个带有循环的线程同时工作。我想在每个循环上增加一个计数器。
循环中的最后一行:
update counter_tbl set counter=counter+1 where id = 5;
是否有可能至少两个线程拾取一个counter
的值并将其增加到相同的值?
例如,counter
为50,两个线程同时完全拾取50并增加它,因此thread1将counter
更新为51,将thread2更新为51,将counter
更新为51再次。所以我们会错过一个增量。这可能吗?如果是,如何避免它?
我可以使用LOCK TABLE
,但由于它的成本,我想避免它。
答案 0 :(得分:0)
实际上这是不可能的,因为这些是更新语句并且会在事务中运行。
如果您的交易包含两个以上的报表,则只需要锁定表。
答案 1 :(得分:0)
您不必使用LOCK TABLE
。数据库服务器按事务一致。在这种情况下,您的查询是一个事务,当两个线程尝试更新同一记录时,数据库服务器将处理该concurency。如果可能,事务将按到达顺序(或服务器确定的任何顺序)执行,如果不是,将发生死锁(在这种情况下,您可以安全地重新发送特定方案中的事务! )。