Я использую "mongoose": "^5.7.1"
в своем проекте Node.js. Я делаю API, который включает обновление в двух документах. Итак, я использую транзакции следующим образом:
// Start the transaction
session = await mongoose.startSession()
session.startTransaction()
await Promise.all([
<1st update operation>,
<2nd update operation>
])
// Commit the transaction
session.commitTransaction()
Когда я нажимаю этот API в моей локальной среде, я получаю следующую ошибку:
MongoError: Это развертывание MongoDB не поддерживает повторяющиеся записи. Пожалуйста, добавьте retryWrites = false в строку подключения.
Когда я ударил этот API в удаленной среде, то он работает нормально. Я использую https://www.clever-cloud.com в качестве облака базы данных и AWS в качестве облака API.
Как написано в сообщении об ошибке, я попытался поставить retryWrites=false
- в конце строки подключения, которую я передаю в мангуст, как
mongodb://${ip}:${port}/${this.MONGO_DATABASE}?retryWrites=false
- с параметрами,
retryWrites: false
переданнымиmongoose.connect
методу.
mongoose.connect(`mongodb://${ip}:${port}/${this.MONGO_DATABASE}`, {
useNewUrlParser: true,
useUnifiedTopology: true,
useCreateIndex: true,
retryWrites: false
}, (err) => {...})
Ни один из вышеперечисленных не решил проблему.
Ниже приведен вывод mongo --version
команды:
db version v4.0.13
git version: bda366f0b0e432ca143bc41da54d8732bd8d03c0
allocator: system
modules: none
build environment:
distarch: x86_64
target_arch: x86_64
Я имею отладку и нахожу фактическую ошибку за выбрасыванием этой ошибки:
MongoError: Номера транзакций разрешены только для члена набора реплик или mongos
Пожалуйста, предложите что-нибудь.
Ответы:
Транзакции, несомненно, являются самой интересной новой функцией в MongoDB 4.0. Но, к сожалению, большинство инструментов для установки и запуска MongoDB запускают автономный сервер, а не набор реплик. Если вы попытаетесь запустить сеанс на автономном сервере, вы получите эту ошибку.
Эта проблема может быть решена с помощью наборов реплик в вашей локальной среде.
Я использовал run-rs для этой цели.
источник
Как указано в принятом ответе, вам нужно, чтобы ваш локальный сервер работал как набор реплик, чтобы иметь возможность выполнять транзакции, в отличие от автономного сервера.
Однако, в дополнение к предлагаемому решению, вы можете легко преобразовать свою автономную локальную базу данных в набор реплик без использования стороннего инструмента , следуя инструкциям в документации MongoDB , обобщенно изложенной следующим образом:
replSet
аргументом.mongo
оболочки и запустите новый набор реплик.Теперь у вас должен быть набор реплик вместо автономного сервера mongodb, где вы можете выполнять транзакции в своей локальной среде для обновления нескольких документов одновременно!
Не забывайте включать
replSet
аргумент каждый раз, когда вы хотите запустить сервер, иначе он будет запущен как автономный. Я просто использую ту же команду, что и на шаге 1, чтобы запустить ее снова.Кроме того, вы можете развернуть новый набор реплик с нуля для тестирования среды, следуя этим другим инструкциям в документации MongoDB.
источник
Пожалуйста, отредактируйте
App/Config/database
файл Добавить'retryWrites'=>false
в строку подключения Mongodbнаписать монго дб соединение
Сохранить и запустить
источник
Пожалуйста, попробуйте добавить
&retryWrites=false
в строку подключения-
Я на самом деле получил ошибки, упомянутые в OP при подключении к нашему удаленному серверу БД, тогда как он работал локально. Я связался с нашей службой поддержки в Монго, прежде чем пытаться предположить, что это ошибка.
-
Вот что сказал наш хостинг-сайт монго (mLab):
Вероятно, драйвер вашего приложения был обновлен до более поздней версии, которая пытается использовать функцию только для WiredTiger. Как упоминается в сообщении об ошибке, вам нужно добавить & retryWrites = false в строку подключения.
https://docs.mlab.com/faq/#why-am-i-getting-the-transaction-numbers-are-only-allowed-on-storage-engines-that-support-document-level-locking-error
источник