php出现往mongodb中写入顺序与实际写入顺序不一致的的情况

如果你查询mongodb中某个集合查询条件中恰巧有一项时顺序递增的值(类似mysql中的自增主键字段),且按这个值的范围查询,而又恰巧排序所用的字段为_id,那么此时代码查询返回的结果在部分情况下会有问题,即会漏掉某些记录。

以下面两段代码为示例来说明

$resultOne= Feeds::find([
                [
                    'uuid' => ['$gt' => (int)$lastTid],
                    'isdelete' => 0,
                ],
                'sort' => ['uuid' => -1],
            ]);


$resultTwo = Feeds::find([
                [
                    'uuid' => ['$gt' => (int)$lastTid],
                    'isdelete' => 0

                ],
                'sort' => ['_id' => -1],
            ]);

其中$lastTid为上次查询结果中uuid为最大的值,可以理解和php中用microtime(true)生成的值的意义一样。

$resultOne变量返回的结果不会漏掉某些结果,比如有一组uuid从大到小的值为2097935,2097934,2097933,2097932,2097931这五项值,$resultOne会正常返回这五项的值。


但是$resultTwo在部分情况下会出现查找到了2097935和2097931,但没有查找到2097934,2097933,2097932这三项。原因是什么呢?

原因是由于uuid在触发写入feeds前是严格按递增的顺序已生成好的,但如果并发量高的情况下,先生成的uuid最终并不一定先写入feeds集合中,即在同一时刻,在同一个for循环中往mongodb中写入单条记录,先执行的写记录请求的并不一定先写入mongodb中,最终视mongodb写入的情况而定,例如:

for($i=0 $i<10; $i++) {
    $this->mongo->feeds->insert(['uuid' => $uuid, 'isdelete' => 0]);
}
上面的就有可能出现第$i=8条比第$i=5条先写入到feeds集合中,这种情况并不是每次都会出现,而是偶尔会出现。

结论就是php调用php的mongo扩展往mongodb中写入数据时与最终实际写入的顺序有可能不一样。



猜你喜欢

转载自blog.csdn.net/ligaofeng/article/details/52947192
今日推荐