Что такое TransientTransactionError в Mongoose (или MongoDB)?

У меня есть server.js и db.js. Файл db.js взаимодействует с моей базой данных с помощью Mongoose, и я использую server.js для вызова функций из db.js:

var mongoose = require('mongoose');
mongoose.connect('', { useNewUrlParser: true })
var Schema = mongoose.Schema;

module.exports = function () {
    var db = mongoose.connection;
    db.on('error', console.error.bind(console, 'connection error:'));
    return db.once('open', function() {
        console.info("Connected to DB")
        var postschema = new Schema({
            title: String,
            intro: String,
            body: String,
            author: String,
            timestamp: { type: Date, default: Date.now }
        });

        var post = mongoose.model('post', postschema);

        return {
            newPost(title, intro, body, author) {
                var newpost = new post({
                    title: title,
                    intro: intro,
                    body: body,
                    author: author
                })
            },
            getPostsAll() {
                post.find({}, function (err, res) {
                    return (`Error:${err} Posts:${res}`)
                })
            }
        }
    })
}

И мой server.js вызывает три функции из db.js:

var DB = require('./db.js')
var db = DB()
db.getPostsAll()
db.newPost()

Я не понимаю, почему я получаю эту ошибку:

connection error: { MongoNetworkError: connection 4 to black-test-shard-00-01-ewyaf.mongodb.net:27017 closed
at TLSSocket.<anonymous> (E:\HTML\black-box\node_modules\mongodb-core\lib\connection\connection.js:276:9)
at Object.onceWrapper (events.js:272:13)
at TLSSocket.emit (events.js:185:15)
at _handle.close (net.js:541:12)
at TCP.done [as _onclose] (_tls_wrap.js:379:7)
  name: 'MongoNetworkError',
  errorLabels: [ 'TransientTransactionError' ],
  [Symbol(mongoErrorContextSymbol)]: {} }

Что я делаю не так? Я нашел статья, но ничего не могу сделать.

@SagnikPradhan Я хотел бы добавить сюда одну странную вещь. Я этого не сделаю, если я здесь ошибаюсь. Я добавил свой IP-адрес, который я получил из командной строки (команда Ipconfig), и это не сработало. Но когда я попросил кластер получить мой IP-адрес, он получил другой, и это сработало. Если бы кто-нибудь мог объяснить почему, я чувствую, что это добавило бы кое-что к поставленному выше вопросу.

vibhor vaish 21.04.2019 17:46

@vibhorvaish Это мог быть ваш локальный IP-адрес.

Sagnik Pradhan 22.04.2019 03:46
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
34
2
41 457
16
Перейти к ответу Данный вопрос помечен как решенный

Ответы 16

Ответ принят как подходящий

What is a TransientTransactionError

TransientTransactionError - это транзакционная ошибка, которая классифицируется как временная, и при повторной попытке май будет успешной. Более того, конфликт записи TransientTransactionError возникает перед фиксацией, когда не была произведена блокировка записи и транзакция (новые данные) не отражена в моментальном снимке транзакции (предыдущие данные). В результате эти ошибки полностью безопасны для повторной попытки, пока не произойдет это успешная фиксация.

Транзакции, которые повторяют попытку в этом сценарии, повторяются с начала транзакции.

Иметь ввиду Эта метка ошибки отличается от ошибок фиксации, которые происходят, когда блокировка была взята, но транзакция не может завершить свое фиксацию. Метка ошибки для этого - UnknownTransactionCommitResult. Ссылка на это примечательна из-за разницы в понимании того, где в вашем приложении возникает ошибка, и какова может быть основная причина и как приложение может и или будет реагировать из-за различных типов ошибок.

Если вы используете Драйверы, поддерживаемые MongoDB, есть две возможные причины, по которым код получает эту ошибку:

  • Любая ошибка команды базы данных, которая включает метку ошибки «TransientTransactionError» в поле «errorLabels».
  • Любая сетевая ошибка, обнаруженная при выполнении любой команды, кроме commitTransaction в транзакции.

Пример кода в Транзакции MongoDB: повторная транзакция показывает, как обрабатывать TransientTransactionError.

Если сообщение об ошибке - MongoNetworkError, это означает, что временная ошибка транзакции связана с сетевым подключением между клиентом и сервером. Это может быть либо одноразовый сетевой сбой, который можно повторить, либо отсутствие доступа к сети, требующего настройки сети. Если ошибка возникает при первой попытке клиента получить доступ к серверу, вероятно, требуется конфигурация сети. Если сервер находится в MongoDB Atlas, см. Настроить записи белого списка.

Единственное, что я хотел бы добавить, это то, что ошибка transienttransactionerror - это попытка транзакции, которая не указана в моментальном снимке (предыдущие данные) и до взятия блокировки записи. Скорее всего, из-за ошибки сетевого подключения или конфликта записи. Думайте о конфликте записи как о чем-то, что не позволяет вам писать или брать блокировку записи из-за обстоятельств ... то есть до совершения любого вида фиксации.

Christian Matthew 25.03.2019 04:33

У меня была аналогичная проблема ... Весь день я мог подключиться через мангуста. Затем я начал получать ошибку TransientTransactionError. Я мог подключиться к mongoDB через оболочку, поэтому я знал, что сервер работает должным образом.

IPv6 / локальный хост. Мой IP переключился с IPv4 на IPv6. Я решил проблему, отключив IPv6 и получив обычный IPv4 IP.

ИЗМЕНИТЬ - кажется, я могу надежно воссоздать / создать эту проблему, подключившись к «localhost», в то время как моя сетевая карта настроена с IPv6 IP. Изменение localhost-> 127.0.0.1, похоже, решает проблему.

Wat? Как ваш IP-адрес переключился с IPv4 на IPv6? : / Как ты "отключил IPv6"?

Bloke 15.02.2019 16:53

@Bloke - я получаю IPv6 IP, подключившись через мобильную точку доступа телефона. Я отключаю IPv6 с помощью sysctl (подробности см. В Google).

terary 20.02.2019 17:04

У меня была такая же проблема / ошибка, хотя и на компьютере с Windows. Хотя я думал, что запустил службу mongodb, я не видел, чтобы она работала в службах Windows. Итак, я вручную запустил службу mongoDB внутри служб, а затем ошибка исчезла. Надеюсь это поможет!

Я столкнулся с этой ошибкой при запуске сценария populatedb.js в учебнике MDN для Express / NodeJS.

Сценарий искал соединение с базой данных, начиная с mongodb://, однако моя строка подключения от mongo началась с mongodb+srv://.

Вместо этого я отредактировал сценарий, чтобы проверить этот синтаксис, что устранило ошибку.

Я надеюсь, что это помогает кому-то.

я имел

  'MongoNetworkError',
  errorLabels: [ 'TransientTransactionError' ],
  [Symbol(mongoErrorContextSymbol)]:

Я добавил свой текущий IP-адрес в белый список после «главная страница> раздел безопасности> доступ к сети> добавить IP» на веб-сайте MongoDB.

Надеюсь, это поможет.

Это буквально решило указанную выше ошибку. Огромное спасибо!

nurealam siddiq 16.11.2019 15:59

У меня возникла эта проблема при попытке подключить мое приложение Heroku к базе данных MongoDB Atlas.

Если вы сделаете на своем терминале

heroku logs --tail

Вы могли бы увидеть

ERROR: { MongoNetworkError: 
connection 4 to cluster0-shard-40-01-qnwp8.mongodb.net:27017 closed
name: 'MongoNetworkError',
errorLabels: [ 'TransientTransactionError' ],
[Symbol(mongoErrorContextSymbol)]: {} }`

После внесения в белый список подключения к серверу в MongoDB Atlas ошибка подключения к базе данных была устранена.

Для меня временная ошибка транзакции возникала всякий раз, когда я переключался с моей сети Wi-Fi на точку доступа моего телефона. Если это произойдет и с вами, перейдите на веб-сайт MongoDB, где вы создали свою базу данных, и снова внесите в белый список свой текущий IP-адрес. Это решит вашу проблему.

Если вы используете MongoDB Atlas. Вам необходимо внести свой IP-адрес в белый список на консоли Atlas в настройках безопасности.

Если проблем с безопасностью нет, а вы просто делаете это для подключения: При настройке белого списка IP-адресов; формат должен быть 0.0.0.0/0, вы не столкнетесь с проблемой.

Более того, как вы сами ответили, мы можем добавить ip, к которому нам нужен доступ.

Вы можете прочитать об ошибке в Интернете, но решение этой проблемы: перейдите к атласу MongoDB и добавьте свой IP-адрес.

Перейти к: главная страница> раздел безопасности> доступ к сети> добавить IP

Эта проблема в основном возникает, когда архитектура не знает ваш собственный IP-адрес.

Кроме того, скопируйте и вставьте прямо в Google, чтобы получить прямое решение.

Если у вас все еще есть эта ошибка, другая причина в том, что вы забыли перезапустить сервер nodemon после изменения файла конфигурации. CTRL + C и начать заново, вот как я это решил.

Безопасность> Доступ к сети> Добавить IP-адрес> Добавить текущий IP-адрес компьютера. Решил мою проблему.

Использование mLab - Когда ваш кластер создан, вам нужно добавить пользователя базы данных (на вкладке «Пользователи») и не устанавливать флажок Make read-only. Как только я это сделал, ошибки исчезли. Я получал те же ошибки, что и выше. Пользователь базы данных может быть вашим логином и паролем.

Спасибо за ответ! Не могли бы вы добавить немного подробностей о том, почему возникает проблема, и Зачем ваш ответ исправляет ее?

Geza Kerecsenyi 22.08.2019 16:52

Перейдите на панель управления MongoDb Atlas. Нажмите «Доступ к сети», нажмите «Добавить IP-адрес» и разрешите подключение с любого IP-адреса. Это должно решить вашу проблему.

А также внесение проблем с безопасностью. Пожалуйста, не делайте этого.

iblamefish 05.10.2019 13:41
  1. Перейдите в панель управления mongoDB Atlas.
  2. Откройте Доступ к сети (там в боковой панели навигации)
  3. Нажмите ДОБАВИТЬ IP-АДРЕС
  4. Нажмите разрешить с любого IP-адреса (это в основном дает доступ к вашему динамическому IP-адресу)

Теперь все готово.

У меня была такая же проблема, когда я пытался подключиться в первый раз, спасибо!

Harvester Haidar 20.03.2020 18:32

Убедитесь, что на сервере не закончилось место для хранения.

В моем случае ни один из предложенных ответов не помог. Я выдергивал волосы, пока не заметил, что сервер просто закончилось место для хранения. Очистка нескольких мегабайт хранилища сразу устранила ошибку.

TransientTransactionError действительно имеет смысл в этом сценарии из-за того, что он является временной ошибкой, которая может быть устранена явной повторной попыткой - хотя мне потребовалось время, чтобы понять, что это связано с проблемой хранения.

Другие вопросы по теме