Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在并发时增加相同的计数器_Mysql_Concurrent Programming - Fatal编程技术网

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

Mysql 在并发时增加相同的计数器,mysql,concurrent-programming,Mysql,Concurrent Programming,我有大约500个线程,循环可以并发工作。我想在每个循环上增加一个计数器 循环中的最后一行: update counter_tbl set counter=counter+1 where id = 5; 是否可能至少两个线程拾取一个计数器的值并将其增加到相同的值 例如,计数器为50,两个线程正好同时拾取50并将其增加,因此thread1将计数器更新为51,而thread2将计数器再次更新为51。因此,我们将错过一个增量。这可能吗?如果是,如何避免 我可以使用锁表,但由于它的成本,我想避免它。实际

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

循环中的最后一行:

update counter_tbl set counter=counter+1 where id = 5;
是否可能至少两个线程拾取一个
计数器的值并将其增加到相同的值

例如,
计数器
为50,两个线程正好同时拾取50并将其增加,因此thread1将
计数器
更新为51,而thread2将
计数器
再次更新为51。因此,我们将错过一个增量。这可能吗?如果是,如何避免


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

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


只有当您有一个由两个或更多语句组成的事务时,才需要锁定表。

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