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ś.

Andro Developer
źródło
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 .

Andro Developer
źródło
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.

gasbi
źródło
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

Arshit
źródło
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

kris
źródło