开发者社区> 问答> 正文

mongodb使用find查询获取的游标是否可以遍历出查询执行后的数据库新增的记录

mongodb使用find查询返回的游标,是否可以遍历出查询执行后(记录比较多查询时间比较长,此时查询还未执行完)数据表新增的记录。
例如:
线程A在时间点t1使用find查询数据表user返回游标,遍历数据记录。
线程B在时间点t2使用insert向数据表user插入记录。
线程B在时间点t3执行完成。
线程A在时间点t4执行完成。
时间:t1 < t2 < t3 < t4
问:线程A是否可以查询到线程B新增的记录?

展开
收起
蛮大人123 2016-02-19 11:28:47 2937 0
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    这是个非常好的问题,简单说 MongoDB 不保证结果是否包含新文档,因为它涉及到多个文档,甚至包括未来可能插入的文档。在传统数据库中,可能读到新插入的值,这一异常情况被称作 Phantom (幽灵),能满足这一点的 isolation (隔离、独立) 级别是最高的 serializable (可串行化),就是说例子中的一读一写两组操作看起来好像是一先一后。用锁机制实现的代价也非常高,性能也就比较差。参见https://segmentfault.com/q/1010000002578303。回到 MongoDB, MongoDB 以文档为单元,能够保证文档级别的隔离,但是不保证多文档间的操作的隔离(独立),也就不支持事务,换来的是高性能。

    @huandu 说的没错,你测试时用 find().batchSize(2) 改成每批次读2个文档,就会发现是可以读到新加入的文档的。默认的 batchSize 在 shell 里是 20,可能就不容易观察到了。别用 batchSize(1), 因为历史原因它等于limit()。

    2019-07-17 18:44:30
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
DTCC 2022大会集锦《云原生一站式数据库技术与实践》 立即下载
阿里云瑶池数据库精要2022版 立即下载
2022 DTCC-阿里云一站式数据库上云最佳实践 立即下载