Что такое 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.log("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)]: {} }

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

Ответ 1

  Что такое TransientTransactionError

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

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

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

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

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

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

Ответ 2

я имел

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

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

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

Ответ 3

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

Ответ 4

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

Сценарий искал соединение БД, начинающееся с mongodb://, однако моя строка соединения от mongo началась с mongodb+srv://.

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

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

Ответ 5

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

enter image description here

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

Ответ 6

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

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

РЕДАКТИРОВАТЬ - кажется, я могу надежно воссоздать/создать эту проблему, подключившись к "localhost", в то время как мой сетевой адаптер настроен с IPv6 IP. Изменение localhost-> 127.0.0.1, кажется, решает проблему.

Ответ 7

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

Ответ 8

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

Ответ 9

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

Ответ 10

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

Ответ 11

Я столкнулся с этой ошибкой, будучи

name: 'MongoNetworkError',
errorLabels: [ 'TransientTransactionError' ],

при попытке подключиться к атласу Монгос. Моя проблема оказалась в том, что я занес в белый список мой проксированный IP-адрес, а не фактический IP-адрес. Отключение моего прокси-сервера и внесение в белый список моего действительного IP-адреса устранили проблему.

Ответ 12

У меня была эта проблема при попытке подключить мое приложение 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 ошибка подключения к базе данных была устранена.

Ответ 13

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

Ответ 14

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

Ответ 15

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

Теперь вы сделали.

Ответ 16

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

Ответ 17

Вы должны изменить текущий IP-адрес при доступе к сети