2017-11-25 5 views
1

안녕하세요 새로운 mongodb 문서가 없으면 Upsert = true로 findOneAndUpdate를 사용하는 노드 js 코드가 있습니다.findOneAndUpdate upsert duplicate prevention 테스트

두 개의 비동기 스레드가 동시에 내 코드를 호출하는지 테스트하고 싶습니다. 그런 다음 중복을 생성합니다.

테스트 할 수 있습니까? 어떻게해야합니까? 나는 테스트의 초보자이다.

답변

0

문서 수준 동시성

WiredTiger 쓰기 작업을위한 문서 수준의 동시성 제어를 사용합니다. 따라서 여러 클라이언트가 동시에 컬렉션의 다른 문서를 수정할 수 있습니다.

대부분의 읽기 및 쓰기 작업에서 WiredTiger는 낙관적 인 동시성 제어를 사용합니다. WiredTiger는 글로벌 데이터베이스 및 수집 수준에서만 의도 잠금을 사용합니다. 저장소 엔진이 두 작업 간의 충돌을 감지하면 쓰기 충돌이 발생하여 이 발생하여 MongoDB가 해당 작업을 투명하게 다시 시도합니다.

많은 글로벌 작업, 일반적으로 여러 데이터베이스와 관련된 수명이 짧은 작업에는 여전히 글로벌 "인스턴스 전체"잠금이 필요합니다. 컬렉션을 삭제하는 등의 일부 작업은 여전히 ​​ 전용 데이터베이스 잠금을 필요로합니다. Document Level Concurrency

그리고 하나의 모음 같은 _id에서

당신이 설명하는 상황이, 새로운 생성됩니다 실행 얻을 것이다 첫 번째 쿼리를 발생하므로 경우에도 _id 그것에 고유 인덱스가 존재하지 않습니다 문서 및 나중에 쿼리를 업데이트합니다.

+0

중복을 사용하면 두 개의 문서가 별도의 ID와 동일한 데이터 값으로 작성된다는 의미입니다. https://docs.mongodb.com/manual/reference/method/db.collection.findAndModify/ Upsert 및 고유 색인에 대한 링크 단락을 확인하십시오. –

+0

좋아요, 나는 당신이 _id와 만 일치하여 업데이 트하는 줄 알았는데. 귀하의 경우 업데이트하기 위해 일치하려는 필드가 고유 색인이되지 않으면 중복 문서로 끝날 수 있습니다. – daemon24

+0

예 사실 내가 테스트 해 볼 수 있는지 알고 싶어하는 사람들을 독특하게 만들었습니다. –