MongoError :이 MongoDB 배포는 재시도 가능한 쓰기를 지원하지 않습니다. 연결 문자열에 retryWrites = false를 추가하십시오


10

"mongoose": "^5.7.1"Node.js 프로젝트에서 사용 하고 있습니다. 두 문서로 업데이트하는 API를 만들고 있습니다. 따라서 다음과 같은 트랜잭션을 사용하고 있습니다.

// Start the transaction
session = await mongoose.startSession()
session.startTransaction()

await Promise.all([
   <1st update operation>,
   <2nd update operation>
])

// Commit the transaction
session.commitTransaction()

로컬 환경 에서이 API를 칠 때 다음 오류가 발생합니다.

MongoError :이 MongoDB 배포는 재시도 가능한 쓰기를 지원하지 않습니다. 연결 문자열에 retryWrites = false를 추가하십시오.

원격 환경 에서이 API를 칠 때 정상적으로 실행됩니다. 내가 사용하고 https://www.clever-cloud.com를 데이터베이스 클라우드 및 API의 클라우드 AWS한다.

오류 메시지에 쓰여진 것처럼 retryWrites=false

  • 몽구스로 전달되는 연결 문자열의 끝에서 mongodb://${ip}:${port}/${this.MONGO_DATABASE}?retryWrites=false
  • 메소드에 retryWrites: false전달 된 옵션 mongoose.connect.
mongoose.connect(`mongodb://${ip}:${port}/${this.MONGO_DATABASE}`, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useCreateIndex: true,
    retryWrites: false
  }, (err) => {...})

위의 어느 것도 문제를 해결하지 못했습니다.

다음은 mongo --version명령 출력입니다 .

db version v4.0.13
git version: bda366f0b0e432ca143bc41da54d8732bd8d03c0
allocator: system
modules: none
build environment:
    distarch: x86_64
    target_arch: x86_64

디버그 하고이 오류를 발생시키는 실제 오류는 다음과 같습니다.

MongoError : 트랜잭션 번호는 복제 세트 멤버 또는 몽고에서만 허용됩니다.

무언가를 제안하십시오.


나는 이러한 오류들도보기 시작했다. Heroku에서 Mlab을 사용하고 있습니다. 그러나 클라이언트에 옵션을 추가하면이 문제가 해결되었습니다. 방금 URI 버전을 시도했지만 잘 작동합니다. 이상한.
Mig

독립형 서버를 사용하고 있는데이 오류가 발생합니다. 초기 오류는 실제 오류가 아니며 이후 오류는 복제 세트 또는 공유 클러스터로 해결할 수 있습니다. 16:30의 npmjs.com/package/run-rs
Andro Developer의

답변:


2

트랜잭션은 의심 할 여지없이 MongoDB 4.0에서 가장 흥미로운 새로운 기능입니다. 그러나 불행하게도 MongoDB 설치 및 실행을위한 대부분의 도구는 복제 세트가 아닌 독립형 서버를 시작합니다. 독립형 서버에서 세션을 시작하려고하면이 오류가 발생합니다.

이 문제는 로컬 환경에서 복제 세트 를 사용하여 해결할 수 있습니다 .

내가 사용하고 실행-RS 이러한 목적을.


2

허용되는 답변에서 제안한 것처럼 독립형 서버가 아닌 트랜잭션을 수행 할 수 있도록 복제본 세트로 로컬 서버를 실행해야합니다.

그러나 제안 된 솔루션 외에도 다음 과 같이 요약 된 MongoDB 설명서의 지침에 따라 타사 도구를 사용하지 않고도 독립형 로컬 DB를 복제 세트로 쉽게 변환 할 수 있습니다 .

  1. 독립형 mongod 인스턴스를 중지하고 replSet인수 와 함께 다시 시작하십시오 .
mongod --port 27017 --dbpath /srv/mongodb/db0 --replSet rs0 --bind_ip localhost
  1. mongo쉘로 인스턴스에 연결 하고 새 복제 세트를 시작하십시오.
rs.initiate()

이제 독립형 mongodb 서버 대신 복제 세트가 있어야합니다. 여기서 로컬 환경에서 트랜잭션을 수행하여 여러 문서를 한 번에 업데이트 할 수 있습니다!

replSet서버를 시작할 때마다 인수 를 포함시키는 것을 잊지 마십시오 . 그렇지 않으면 독립형으로 시작됩니다. 1 단계에서와 동일한 명령을 사용하여 다시 실행합니다.


또는 MongoDB 설명서의 다른 지침에 따라 테스트 환경을 위해 처음부터 새 복제 세트를 배포 할 수 있습니다 .


0

Mongodb 연결 문자열에서 App/Config/database파일 추가 'retryWrites'=>false를 편집 하십시오

Mongo DB 연결 작성

'mongodb' => [
            'driver'   => 'mongodb',
            'host'     => env('MONGO_DB_HOST', 'lo*****'),
            'port'     => *****,
            'database' => env('MONGO_DB_DATABASE'),
            'username' => env('MONGO_DB_USERNAME'),
            'password' => env('MONGO_DB_PASSWORD'),
            'options'  => [
                'database'=> env('MONGO_DB_DATABASE'),
                'retryWrites'=>false
            ]
        ],

저장하고 실행


0

&retryWrites=false연결 문자열에 추가 하십시오

-

원격 DB 서버에 연결할 때 실제로 OP에서 언급 한 오류가 발생했지만 로컬에서 작동했습니다. 오류가 발생한 제안을 시도하기 전에 몽고 호스팅 지원팀에 문의했습니다.

-

이것이 우리의 호스팅 몽고 사이트 (mLab)가 말한 것입니다 :

앱 드라이버가 WiredTiger 전용 기능을 사용하려는 최신 버전으로 업데이트되었을 수 있습니다. 오류에서 언급했듯이 연결 문자열에 & retryWrites = false를 추가해야합니다.

https://docs.mlab.com/faq/#why-am-i-getting-the-transaction-numbers-are-only-allowed-on-storage-engines-that-support-document-level-locking-error

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.