redis - php+mysql模拟消息队列死循环问题?

查看:230
本文介绍了redis - php+mysql模拟消息队列死循环问题?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

我要解决什么问题?
数据库现在有五万条state=600的数据,每次取出1000条进行处理,我需要每五分钟跑一次crontab,将这五万条数据的state变为state=700

我是怎么做的?

while(true)
{
    //每次取出1000条进行处理
    $sql = 'select * from table_a  where state=600 limit 1000';
    $multi_row = $db->query($sql)->get_result();
    if(! $multi_row)
    {
        break;
    }
    //处理队列中的这1000条数据,1改变table_a中state的状态,2在table_b修改一些数据,
    //这两个操作有一个执行不成功我就需要回滚事务
    foreach($multi_row as  $val)
    {
        $db->star_trance();
        if(! $db->table_a->do_something(['state' => 700]))
        {
            $db->rollback();
        }
        if(! $db->table_b()->do_something())
        {
            $db->rollback();
        }
        $db->change()
        
        $db->commint()
    }
}

上述解决方案遇到的问题
我发现每当失败回滚后,数据库会每次查出这条状态没有修改成功的state=600的数据,这就导致了上面$multi_row永远不会空,进而导致整个while循环变成死循环,我又想到我可以统计大概的循环次数,一到循环次数就强制退出,可下次crontab依然会遇到这个问题,我该怎么办?

解决方案

$id = 0;
while(true)
{
    $sql = 'select * from table_a  where state=600 '. ($id ? " AND id < $id" : "") .' order by id desc limit 1000';
    $multi_row = $db->query($sql)->get_result();
    if(! $multi_row)
    {
        break;
    }
    foreach($multi_row as  $val)
    {
       $id = $val['id']; // $val->id??? 
    }
}

这篇关于redis - php+mysql模拟消息队列死循环问题?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆