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: false
die an diemongoose.connect
Methode ü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 --version
Befehls:
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.
Antworten:
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.
quelle
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:
replSet
Argument neu.mongo
Shell eine Verbindung zu Ihrer Instanz her und initiieren Sie das neue Replikatset.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
replSet
Argument 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.
quelle
Bitte bearbeiten Sie die
App/Config/database
Datei'retryWrites'=>false
In Mongodb-Verbindungszeichenfolge hinzufügenschreibe Mongo db verbindung
Speichern und ausführen
quelle
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
quelle