MongoError: Це розгортання MongoDB не підтримує записи, які можна повторно записувати. Будь ласка, додайте retryWrites = false до рядка підключення


10

Я використовую "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

Будь ласка, підкажіть щось.


Я також почав бачити ці помилки. Я використовую Mlab на Heroku. Але додавання опції на клієнті це вирішило. Я просто спробував URI-версію, і вона також працює. Дивно.
Міг

Я використовую окремий сервер, і це викликає цю помилку. Початкова помилка не була фактичною, а пізніша може бути усунена за допомогою кластерів-реплік або спільних кластерів. Дивіться npmjs.com/package/run-rs
Andro Developer

Відповіді:


2

Операції, безперечно, є найбільш захоплюючою новою особливістю в MongoDB 4.0. Але, на жаль, більшість інструментів для встановлення та запуску MongoDB запускають автономний сервер на відміну від набору реплік. Якщо ви спробуєте розпочати сеанс на автономному сервері, ви отримаєте цю помилку.

Цю проблему можна вирішити, використовуючи репліки-набори у вашому локальному середовищі.

Для цієї мети я використовував run-rs .


2

Як запропоновано у прийнятій відповіді, вам потрібно мати свій локальний сервер для запуску у вигляді репліки, щоб мати змогу здійснювати транзакції, на відміну від окремого сервера.

Однак, крім запропонованого рішення, ви можете легко перетворити свій автономний локальний db у набір реплік без використання сторонніх інструментів , дотримуючись інструкцій у документації MongoDB , узагальнених таким чином:

  1. Зупиніть свій автономний екземпляр mongod та перезапустіть його replSetаргументом.
mongod --port 27017 --dbpath /srv/mongodb/db0 --replSet rs0 --bind_ip localhost
  1. Підключіться до свого примірника з mongoоболонкою та ініціюйте новий набір реплік.
rs.initiate()

Тепер ви повинні мати набір реплік замість автономного сервера mongodb, де ви можете здійснювати транзакції у вашому локальному середовищі для оновлення декількох документів одночасно!

Не забудьте включати replSetаргумент щоразу, коли ви хочете запустити сервер, інакше він буде запущений як автономний. Я просто використовую ту саму команду, що і на кроці 1, щоб запустити її знову.


Крім того, ви можете розгорнути новий набір реплік з нуля для тестового середовища, дотримуючись цих інших інструкцій у документації MongoDB.


0

Відредагуйте App/Config/databaseфайл Додати 'retryWrites'=>falseв рядку з'єднання Mongodb

написати з'єднання Mongo db

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

Збережіть і запустіть


0

Спробуйте додати &retryWrites=falseдо рядка з'єднання

-

Я фактично отримав помилки, згадані в ОП під час підключення до нашого віддаленого сервера db, тоді як він працював локально. Я звернувся до служби підтримки нашого монго, перш ніж спробувати пропозицію, яка є помилкою.

-

Ось що сказав наш розміщений сайт mongo (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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.