Что такое TransientTransactionError в Mongoose (или MongoDB)? - PullRequest
0 голосов
/ 03 сентября 2018

Итак, у меня есть два файла. Один - server.js, а другой - db.js. Файл db.js взаимодействует с моим БД с помощью Mongoose, и я использую server.js для вызова функций из db.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)]: {} }

Извините за тупой вопрос, но кто-нибудь может сказать мне, что здесь происходит? И что я делаю не так?

РЕДАКТИРОВАТЬ : Я нашел статью, связанную с этой проблемой: https://docs.mongodb.com/manual/core/transactions/#retry-transaction Но на самом деле ничего не могу из нее сделать.

EDIT 2 : обнаружена проблема. Это была проблема сети, так как она говорит MongoNetworkError, и я думаю, TransientTransactionError относится к некоторой временной проблеме на стороне базы данных. Я решил это, занеся в белый список мой IP-адрес.

Ответы [ 11 ]

0 голосов
/ 18 октября 2018

Что такое TransientTransactionError

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...