首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计数器避免重复使用多线程请求

问计数器避免重复使用多线程请求
EN

Stack Overflow用户
提问于 2017-05-28 02:41:40
回答 1查看 44关注 0票数 0

每当请求/运行这个脚本时,我都会制作一个脚本来获取mysql MyISAM表的数据。该查询如下所示:

从表限制$offset中选择*,10;

问题是,$offset必须在第一个请求中为0,在第二个请求中为10个,在第三个请求中为20个等等。然后,我创建了一个新表,其中我为$offset创建了一个计数器,每次请求该脚本时都会增加+10。

您必须知道脚本同时会有许多请求。请求不是用户(访问),请求是我的软件,运行在5台以上的PC上,每个软件运行着1000多个线程,对这个脚本进行请求。然后,我搜索一个解决方案,如果两个或多个线程同时请求这个脚本,则不会返回到这些线程的结果相同。另外,我需要那个计数器将增量完美。

代码语言:javascript
复制
function GetAndUpdateCounter($numberToAdd)
{
    $link = mysql_connect('localhost','root','abcd1234');
    if(!$link) die ('Could not connect to database: '.mysql_error());

    mysql_select_db('dbcounter',$link);

        // in the 2 lines below I have my question about what happend if 2 or
        // more threads/request do this at same time, will get same result and will do same update
        $result = mysql_query("SELECT id FROM counter");
    mysql_query("UPDATE counter SET id=(id+$numberToAdd);");

    $row = mysql_fetch_array($result, MYSQL_ASSOC);
    mysql_close($link);
    return $row['id'];
}

调用函数的示例

代码语言:javascript
复制
$offset = GetAndUpdateCounter(10);

$q =mysql_query(“从表限制$offset,10中选择*”);

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-28 03:23:53

在列出您的问题解决方案之前,我想给您一条建议:不要,请不要使用mysql_函数,它们可能有害,在最新的please .中被废弃。

有几种方法可以实现你想要的。我会按优先级按升序列出它们。

  1. 手动MySQL表锁。您可以锁定一个表,选择+更新您想要的值,然后再解锁该表。我之所以把它放在优先级列表的第一位,是因为它有一个很好的内部锁定系统,而且效率很高。原型,摘自MySQL的手册页面: 锁表转读,客户写入;从trans customer_id=some_id中选择和(值);更新customer SET total_value=sum_from_previous_statement WHERE customer_id=some_id;解锁表;
  2. 在脚本语言(PHP)中使用相同的锁定原则。您可以通过创建一个仅用于锁定目的的空文件来选择和更新字段的整个过程,或者可以使用Memcached设置、检查进程是否繁忙,并在流程完成后释放。这些方法是不推荐的,因为其中一个进程在处于“繁忙”模式时总是会崩溃,从而阻塞其他进程直到Memcached被释放。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44223341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档