Medoo数据更新有概率会无效

thinkerdev

Workerman使用Medoo数据库操作数据更新时 偶现/经常 失败

使用Timer定时任务更新数据库,奇怪的点,这个失败并不是报错。
示例代码:

start中全局初始化了数据库

$worker->onWorerStart = fn(){
    global $db;
    $db = new Medoo(数据库配置)
}

收到消息时执行http任务并更新数据库

$worker->onMessage = fn(){
    global $db;
    Timer::add(30, fn() use($db){
        // 远程获取http返回内容
        $http = '预先规定的返回内容';
        // 假设 http 返回id,content字段
        if($http = '正确'){
            // 根据id 更新本地数据库对应content字段, 及 status = 1
            // 本地数据库 有个 status = 0 默认, 需要再更新为 status = 1
            $db->update('table', [
                // medoo field
                'content' => $http['content'],
                'status' => 1
            ],[
                // medoo where
                'id' => $http['id']
            ]); // medoo 更新操作
            // 打印日志 提示 成功
            echo 'http 正确,数据库更新 - 成功'
        } else {
            // 打印日志 提示 失败
            echo 'http 错误,数据库不更新 - 失败'
        }
    })
}

出现问题地方在于:
onMessage回调中 $db->update 这里,

偶尔或经常在日志提示成功时,数据库相关的内容也不会更新

比如:日志提示成功了,数据库 content 字段确实被更新了,但 status = 0 默认 字段依然是默认的,期间运行中也没有任何报错

又或者: 日志也提示成功了, 但数据库中什么也没更新 contentstatus = 0 默认 都没用被更新, 同样也没有报错

但是,还是会有按预期把数据完整更新的,也就是 contentstatus = 1 都更新了

这个问题无从定位是哪里的原因,使用了try catch也没有异常发生,想请问是Medoo的原因还是本身业务代码上有什么问题吗?请大佬帮助分析下

操作系统环境及workerman/webman等具体版本

OS:Ubuntu 及 Centos
启动方式:宝塔 - 进程守护
php worker.php start

250 1 0
1个回答

pole

试着更新的时候把当前时间作为字段也更新一下

  • xiasha11 2024-01-22

    'content' => $http['content'],
    'status' => 1
    有没有可能这两个字段数据库里和提交的是一致的?medoo updata如果信息一致会返回更新失败

  • thinkerdev 2024-01-22

    不会的,这2个字段的值从http过来的数据一定不会一致,status = 0创建时就默认的,content也不会一样。问题就是medoo并没有报错,查看了log也是正确语句。现在测试的,加上了 updateTime 也作为更新字段后一切正常

🔝