mongodb使用find查询获取的游标是否可以遍历出查询执行后的数据库新增的记录
phpcn_u1582
phpcn_u1582 2017-04-24 16:00:18
0
2
1061

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

phpcn_u1582
phpcn_u1582

모든 응답(2)
Ty80

매우 좋은 질문입니다. 간단히 말해서 MongoDB는 여러 문서, 심지어 나중에 삽입될 수 있는 문서도 포함하기 때문에 결과에 새 문서가 포함되는지 여부를 보장하지 않습니다. 기존 데이터베이스에서는 새로 삽입된 값을 읽는 것이 가능합니다. 이를 만족할 수 있는 격리 수준은 가장 높은 직렬화 가능(serialized) 수준입니다. 예에서는 두 가지 작업 집합을 한 번 읽습니다. 그리고 하나의 글쓰기가 차례로 수행되는 것 같습니다. 잠금 메커니즘을 구현하는 데 드는 비용도 매우 높으며 성능도 상대적으로 낮습니다. 이 논문을 참조하세요. MongoDB로 돌아가서 MongoDB는 문서를 단위로 사용하고 문서 수준 격리를 보장할 수 있지만 고성능을 대가로 여러 문서 간의 작업 격리(독립성)를 보장하지 않으며 트랜잭션을 지원하지 않습니다.

@huandu가 맞습니다. 테스트할 때 find().batchSize(2)를 사용하여 각 배치에서 2개의 문서를 읽으면 새로 추가된 문서를 읽을 수 있음을 알 수 있습니다. 셸의 기본 배치 크기는 20인데 이는 관찰하기 쉽지 않을 수 있습니다. 역사적 이유로 인해limit()와 동일한 BatchSize(1)를 사용하지 마십시오.

曾经蜡笔没有小新

꼭 그렇지는 않습니다.

mongodb 커서는 격리되지 않으며 업데이트된 데이터를 반환할 수 있습니다.

그러나 실제 시도에서는 아무리 삽입해도 새로 삽입된 데이터가 커서로 반환되지 않는 것으로 나타났습니다. 이는 mongodb의 구현 세부 사항일 수도 있고 특정 특수 상황에서만 커서가 새로 삽입된 데이터에 액세스할 수 있을 수도 있습니다. 즉, 문서 지원이 없으므로 이 동작에 의존해서는 안 됩니다.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿