MongoError: To wdrożenie MongoDB nie obsługuje zapisów z możliwością ponownej próby. Dodaj retryWrites = false do ciągu połączenia


10

Używam "mongoose": "^5.7.1"w moim projekcie Node.js. Tworzę interfejs API, który wymaga aktualizacji w dwóch dokumentach. Tak więc korzystam z transakcji, takich jak:

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

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

// Commit the transaction
session.commitTransaction()

Po naciśnięciu tego interfejsu API w lokalnym środowisku pojawia się następujący błąd:

MongoError: To wdrożenie MongoDB nie obsługuje zapisów z możliwością ponownej próby. Dodaj retryWrites = false do ciągu połączenia.

Gdy uderzę w ten interfejs w zdalnym środowisku, działa dobrze. Używam https://www.clever-cloud.com jako chmury bazy danych i AWS jako chmury api.

Jak napisano w komunikacie o błędzie, próbowałem umieścić retryWrites=false

  • na końcu ciągu połączenia, który przekazuję do mangusty jako mongodb://${ip}:${port}/${this.MONGO_DATABASE}?retryWrites=false
  • z opcjami retryWrites: falseprzekazanymi do mongoose.connectmetody.
mongoose.connect(`mongodb://${ip}:${port}/${this.MONGO_DATABASE}`, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useCreateIndex: true,
    retryWrites: false
  }, (err) => {...})

Żadne z powyższych nie rozwiązało problemu.

Poniżej znajduje się wynik mongo --versionpolecenia:

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

Mam debugowanie i znajduję rzeczywisty błąd powodujący zgłoszenie tego błędu:

MongoError: Numery transakcji są dozwolone tylko w przypadku elementu zestawu repliki lub mongo

Proszę zasugerować coś.


Te błędy też zacząłem widzieć. Używam Mlab na Heroku. Ale dodanie opcji na kliencie rozwiązało to. Właśnie wypróbowałem wersję URI i to również działa. Dziwne.
Mig

Korzystam z autonomicznego serwera, który powoduje ten błąd. Błąd początkowy nie był faktyczny, a później można go rozwiązać za pomocą zestawu replik lub udostępnionych klastrów. Zobacz npmjs.com/package/run-rs
Andro Developer

Odpowiedzi:


2

Transakcje to bez wątpienia najbardziej ekscytująca nowa funkcja w MongoDB 4.0. Niestety, większość narzędzi do instalowania i uruchamiania MongoDB uruchamia samodzielny serwer w przeciwieństwie do zestawu replik. Jeśli spróbujesz rozpocząć sesję na samodzielnym serwerze, pojawi się ten błąd.

Ten problem można rozwiązać za pomocą zestawów replik w lokalnym środowisku.

Użyłem do tego run-rs .


2

Zgodnie z sugestią przyjętą w odpowiedzi, serwer lokalny musi być uruchamiany jako zestaw replik, aby móc wykonywać transakcje, w przeciwieństwie do serwera autonomicznego.

Jednak oprócz proponowanego rozwiązania można łatwo przekonwertować autonomiczną lokalną bazę danych na zestaw replik bez użycia narzędzi innych firm , postępując zgodnie z instrukcjami w dokumentacji MongoDB , podsumowanymi w następujący sposób:

  1. Zatrzymaj samodzielną instancję mongod i uruchom ją ponownie z replSetargumentem.
mongod --port 27017 --dbpath /srv/mongodb/db0 --replSet rs0 --bind_ip localhost
  1. Połącz się z instancją za pomocą mongopowłoki i zainicjuj nowy zestaw replik.
rs.initiate()

Teraz powinieneś mieć zestaw replik zamiast samodzielnego serwera mongodb, w którym możesz wykonywać transakcje w lokalnym środowisku, aby aktualizować wiele dokumentów jednocześnie!

Nie zapomnij dołączyć replSetargumentu za każdym razem, gdy chcesz uruchomić serwer, w przeciwnym razie zostanie uruchomiony jako samodzielny. Po prostu używam tego samego polecenia, co w kroku 1, aby uruchomić go ponownie.


Alternatywnie możesz wdrożyć nowy zestaw repliki od podstaw do testowania środowiska, postępując zgodnie z tymi innymi instrukcjami w dokumentacji MongoDB.


0

Edytuj App/Config/databaseplik Dodaj 'retryWrites'=>falsew ciągu połączenia Mongodb

napisz połączenie bazy danych Mongo

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

Zapisz i uruchom


0

Spróbuj dodać &retryWrites=falsedo ciągu połączenia

-

Naprawdę dostałem błędy wymienione w OP podczas łączenia się z naszym zdalnym serwerem db, podczas gdy on działał lokalnie. Skontaktowałem się z naszym wsparciem hostowanym w Mongo przed wypróbowaniem sugestii, która zawiera błąd.

-

Oto, co powiedziała nasza hostowana strona mongo (mLab):

Prawdopodobnie sterownik Twojej aplikacji został zaktualizowany do nowszej wersji, która próbuje użyć funkcji tylko dla WiredTiger. Jak wspomina błąd, musisz dodać & retryWrites = false do ciągu połączenia.

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.