MongoError: Diese MongoDB-Bereitstellung unterstützt keine wiederholbaren Schreibvorgänge. Bitte fügen Sie Ihrer Verbindungszeichenfolge retryWrites = false hinzu

10

Ich verwende "mongoose": "^5.7.1"in meinem Node.js-Projekt. Ich mache eine API, die das Aktualisieren in zwei Dokumenten beinhaltet. Daher verwende ich die Transaktionen wie folgt:

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

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

// Commit the transaction
session.commitTransaction()

Wenn ich diese API in meiner lokalen Umgebung drücke, wird folgende Fehlermeldung angezeigt:

MongoError: Diese MongoDB-Bereitstellung unterstützt keine wiederholbaren Schreibvorgänge. Bitte fügen Sie Ihrer Verbindungszeichenfolge retryWrites = false hinzu.

Wenn ich diese API in einer Remote-Umgebung drücke, läuft sie einwandfrei. Ich verwende https://www.clever-cloud.com als Datenbank-Cloud und AWS als API-Cloud.

Wie in der Fehlermeldung geschrieben, habe ich versucht zu setzen retryWrites=false

  • am Ende der Verbindungszeichenfolge, die ich als an Mungo weitergebe mongodb://${ip}:${port}/${this.MONGO_DATABASE}?retryWrites=false
  • mit Optionen, retryWrites: falsedie an die mongoose.connectMethode übergeben wurden.
mongoose.connect(`mongodb://${ip}:${port}/${this.MONGO_DATABASE}`, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useCreateIndex: true,
    retryWrites: false
  }, (err) => {...})

Keiner der oben genannten Punkte hat das Problem behoben.

Unten ist die Ausgabe des mongo --versionBefehls:

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

Ich habe debug und finde den tatsächlichen Fehler hinter dem Auslösen dieses Fehlers ist:

MongoError: Transaktionsnummern sind nur für ein Replikatsatzmitglied oder Mongos zulässig

Bitte schlagen Sie etwas vor.

Andro Entwickler
quelle
Ich fing auch an, diese Fehler zu sehen. Ich benutze Mlab auf Heroku. Das Hinzufügen der Option auf dem Client löste dies jedoch. Ich habe gerade die URI-Version ausprobiert und sie funktioniert auch. Seltsam.
Mig
Ich verwende einen eigenständigen Server und das verursacht diesen Fehler. Der anfängliche Fehler war nicht der tatsächliche und der spätere kann mit Replikatsätzen oder gemeinsam genutzten Clustern behoben werden. Siehe npmjs.com/package/run-rs
Andro Developer

Antworten:

2

Transaktionen sind zweifellos die aufregendste Neuerung in MongoDB 4.0. Leider starten die meisten Tools zum Installieren und Ausführen von MongoDB einen eigenständigen Server im Gegensatz zu einem Replikatsatz. Wenn Sie versuchen, eine Sitzung auf einem eigenständigen Server zu starten, wird dieser Fehler angezeigt.

Dieses Problem kann mithilfe von Replikatsätzen in Ihrer lokalen Umgebung behoben werden .

Ich habe zu diesem Zweck Run-Rs verwendet.

Andro Entwickler
quelle
2

Wie in der akzeptierten Antwort vorgeschlagen, muss Ihr lokaler Server als Replikatsatz ausgeführt werden, damit Transaktionen ausgeführt werden können, im Gegensatz zu eigenständigen Servern.

Zusätzlich zu der vorgeschlagenen Lösung können Sie Ihre lokale Standalone-Datenbank jedoch problemlos in ein Replikatset konvertieren, ohne ein Tool eines Drittanbieters zu verwenden. Befolgen Sie dazu die Anweisungen in der MongoDB-Dokumentation , die wie folgt zusammengefasst sind:

  1. Stoppen Sie Ihre eigenständige Mongod-Instanz und starten Sie sie mit dem replSetArgument neu.
mongod --port 27017 --dbpath /srv/mongodb/db0 --replSet rs0 --bind_ip localhost
  1. Stellen Sie mit einer mongoShell eine Verbindung zu Ihrer Instanz her und initiieren Sie das neue Replikatset.
rs.initiate()

Jetzt sollten Sie ein Replikatset anstelle eines eigenständigen Mongodb-Servers haben, auf dem Sie Transaktionen in Ihrer lokalen Umgebung ausführen können, um mehrere Dokumente gleichzeitig zu aktualisieren!

Vergessen Sie nicht, das replSetArgument jedes Mal anzugeben, wenn Sie den Server starten möchten, da es sonst als eigenständig gestartet wird. Ich benutze einfach den gleichen Befehl wie in Schritt 1, um ihn erneut auszuführen.


Alternativ können Sie ein neues Replikatset von Grund auf für die Testumgebung bereitstellen, indem Sie diese anderen Anweisungen in der MongoDB-Dokumentation befolgen.

gasbi
quelle
0

Bitte bearbeiten Sie die App/Config/databaseDatei 'retryWrites'=>falseIn Mongodb-Verbindungszeichenfolge hinzufügen

schreibe Mongo db verbindung

'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
            ]
        ],

Speichern und ausführen

Arshit
quelle
0

Bitte versuchen Sie &retryWrites=false, Ihre Verbindungszeichenfolge zu ergänzen

- -

Ich habe tatsächlich die im OP erwähnten Fehler beim Herstellen einer Verbindung zu unserem Remote-Datenbankserver erhalten, während dieser lokal funktionierte. Ich habe unseren von Mongo gehosteten Support kontaktiert, bevor ich den fehlerhaften Vorschlag ausprobiert habe.

- -

Dies ist, was unsere gehostete Mongo-Site (mLab) sagte:

Es ist wahrscheinlich, dass der Treiber Ihrer App auf eine neuere Version aktualisiert wurde, die versucht, eine Nur-WiredTiger-Funktion zu verwenden. Wie im Fehler erwähnt, müssen Sie Ihrer Verbindungszeichenfolge & retryWrites = false hinzufügen.

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

kris
quelle