MongoError:このMongoDBデプロイメントは、再試行可能な書き込みをサポートしていません。接続文字列にretryWrites = falseを追加してください


10

私は"mongoose": "^5.7.1"Node.jsプロジェクトで使用しています。私は2つのドキュメントの更新を含む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:トランザクション番号は、レプリカセットメンバーまたはmongosでのみ許可されます

何か提案してください。


私もこれらのエラーを見始めました。HerokuでMlabを使用しています。しかし、クライアントにオプションを追加することでこれは解決しました。私はURIバージョンを試してみましたが、同様に機能します。奇妙な。
Mig

スタンドアロンサーバーを使用しているため、このエラーが発生しています。最初のエラーは実際のエラーではなく、後のエラーはレプリカセットまたは共有クラスターで解決できます。npmjs.com/package/run-rs
Andro Developer

回答:


2

トランザクションは間違いなく、MongoDB 4.0の最もエキサイティングな新機能です。しかし残念ながら、MongoDBをインストールして実行するためのほとんどのツールは、レプリカセットではなくスタンドアロンサーバーを起動します。スタンドアロンサーバーでセッションを開始しようとすると、このエラーが発生します。

この問題は、ローカル環境でレプリカセットを使用することで解決できます。

この目的でrun-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

App/Config/databaseファイルを編集'retryWrites'=>falseしてMongodb接続文字列に追加してください

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接続文字列に追加してみてください

-

ローカルで動作していたのに、リモートデータベースサーバーに接続すると、OPで言及されているエラーが実際に発生しました。エラーのある提案を試す前に、mongoがホストするサポートに連絡しました。

-

これは私たちがホストしているmongoサイト(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.