大数据、高并发下查询不到数据(实际数据存在)

请求QPH在50万左右这个量级
表单数据在5000万到1亿这个数据量
首先执行的是firstOrCreate()方法🙅(由于要分表,现在没法用,只能先查询,然后没有记录再去创建新记录)
然后捕获了唯一索引的异常,捕获后再去查询,但是查不到数据,这种情况下该怎么解决?
已经是在队列里了
求大佬支招~

 try {
            $watchLogModel = WatchLogModel::suffix($suffix)
                ->where('transId', $transId)
                ->first();
            if (!$watchLogModel) {
                $watchLogModel = new WatchLogModel();
                $watchLogModel->setTable('watch_log_' . $suffix);
                $watchLogModel->transId = $transId;
                $watchLogModel->save();
            } else {
                $watchLogModel->setTable('watch_log_' . $suffix);
            }
        } catch (QueryException $queryException) {
            if ($queryException->getCode() == '23000') {
              //捕获唯一索引异常,然后去查记录
                $watchLogModel = WatchLogModel::suffix($suffix)
                    ->where('transId', $transId)
                    ->first();
                //这里的查询结果有时候是null
            } else {
                throw  $queryException;
            }
        }
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 22

我碰到过,和事务隔离级别有关,RR隔离级别查不到,RC可以,解决方法是getPdo()->exec('set session transaction isolation level read committed')

11个月前 评论

高并发查不到正常,都还没来得及写入,肯定就查不到了。 通常加缓存,缓存在放队列写入,查的时候缓存优先

11个月前 评论

如果 DB 层没有做读写分离,应该关注 隔离级别 设置

我猜测你的 DB 应该是 RC 及以上的隔离级别,T1 事务插入数据后还未提交事务,然后其他事务插入报错,但这个时候是查不到这条数据的,但感觉是很边界的情况。

11个月前 评论

是不是上了读写分离,写入的时候还没同步到读库的时间差问题

11个月前 评论
寞小陌 (楼主) 11个月前
令龙家的小道 (作者) 11个月前
令龙家的小道 (作者) 11个月前
寞小陌 (楼主) 11个月前

读写分离 强制走写库看看

11个月前 评论
寞小陌 (楼主) 11个月前

实际有遇到过这个问题,最开始也是通过你这种通过捕获数据库异常解决,后来改成了 Redis Lock,也就是加锁,后面的等前面处理完,然后就世界和平了

11个月前 评论
寞小陌 (楼主) 11个月前

要不改为ON DUPLICATE KEY UPDATE?

11个月前 评论

主从延迟呗,这边写了,从数据库还没更新所以查不到,可以强制读主数据库

11个月前 评论
sanders

我建议先了解一下业务需求,对写入的时效性是否有很高的要求,如果要求不高可以使用队列进行消化,尤其是 laravel 可以使用 唯一任务 来针对主键加锁来控制队列消费。

如果时效性要求较高,则可以考虑使用数据库事务和行锁进行处理。

11个月前 评论
寞小陌 (楼主) 11个月前
寞小陌 (楼主) 11个月前
她来听我的演唱会 11个月前
sanders (作者) 11个月前
寞小陌 (楼主) 11个月前
sanders (作者) 11个月前
寞小陌 (楼主) 11个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!