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: false
przekazanymi domongoose.connect
metody.
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 --version
polecenia:
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ś.
Odpowiedzi:
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 .
źródło
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:
replSet
argumentem.mongo
powłoki i zainicjuj nowy zestaw replik.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ć
replSet
argumentu 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.
źródło
Edytuj
App/Config/database
plik Dodaj'retryWrites'=>false
w ciągu połączenia Mongodbnapisz połączenie bazy danych Mongo
Zapisz i uruchom
źródło
Spróbuj dodać
&retryWrites=false
do 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
źródło