什么是Mongoose(或MongoDB)中的TransientTransactionError? [英] What is a TransientTransactionError in Mongoose (or MongoDB)?

查看:647
本文介绍了什么是Mongoose(或MongoDB)中的TransientTransactionError?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有server.jsdb.js db.js文件使用Mongoose与我的数据库交互,并且我使用server.jsdb.js调用函数:

I have server.js and db.js The db.js file interacts with my database using Mongoose and I use server.js to call functions from 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调用了三个函数:

And my server.js calls three functions from db.js :

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

我不明白为什么会出现此错误:

I don't understand why I get this error :

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)]: {} }

我做错了什么?我发现了一篇文章,但是却无能为力. /p>

What am I doing wrong? I found an article but can't make anything of it.

推荐答案

什么是TransientTransactionError

What is a TransientTransactionError

A TransientTransactionError是归类为暂时性的交易错误,如果重试,则可能成功.此外,当未采取任何写锁定且事务(新数据)未反映在事务快照(先前的数据)中时,在提交之前发生TransientTransactionError写冲突.因此,在发生这些错误之前,可以完全安全地重试这​​些错误.是一次成功的提交.

A TransientTransactionError is a transactional error that is classified as temporary, and if retried it may be successful. Furthermore, a TransientTransactionError write conflict occurs prior to a commit when no write lock has been taken and the transaction (new data) is not reflected in the transaction snapshot (previous data.) As a result, these errors are completely safe to retry until there is a successful commit.

在这种情况下重试的事务将从事务开始时重试.

Transactions that retry in this scenario are retried from the beginning of the transaction.

请紧记:此错误标签与已采取锁定但事务无法完成其提交的提交错误不同.为此的错误标签是UnknownTransactionCommitResult.之所以值得一提,是因为在理解应用程序中发生错误的位置,潜在的原因是什么以及由于不同的错误类型而导致应用程序可以或将如何响应的理解上存在差异.

Keep in mind This error label is different than commit errors that happen when the lock has been taken but the transaction can't complete its commit. The error label for this is UnknownTransactionCommitResult. The reference to this is notable due to the difference in understanding where in your application an error is occurring and what may be the underlying cause and how the application can and or will respond due to different error types.

如果您使用的是 MongoDB支持的驱动程序,则可能有两种原因代码出现此错误:

If you're using MongoDB supported drivers, there are two possible cause the code is getting this error:

  • 在"errorLabels"字段中包含"TransientTransactionError"错误标签的任何数据库命令错误.
  • 在网络中运行 commitTransaction 以外的任何命令都遇到任何网络错误.交易.
  • Any database command error that includes the "TransientTransactionError" error label in the "errorLabels" field.
  • Any network error encountered running any command other than commitTransaction in a transaction.

MongoDB事务:retry-transaction 中的代码示例演示如何处理TransientTransactionError.

The code example in MongoDB Transactions: retry-transaction show cased how to handle TransientTransactionError.

如果错误消息为MongoNetworkError,则表示瞬时事务错误与客户端和服务器之间的网络连接有关.这可能是一次可重试的网络故障,也可能是没有需要网络配置的网络访问.如果客户端在第一次尝试访问服务器时遇到错误,则可能需要网络配置.如果服务器位于MongoDB Atlas上,请参阅配置白名单条目.

If the error message is MongoNetworkError, it means the transient transaction error is related to the network connectivity between the client and the server. This could either be a one time network glitch which is retry-able, or there is no network access which require network configuration. If the error is encountered on the first time the client trying to access the server, it is likely that there is network configuration needed. If the server is on MongoDB Atlas, please see Configure Whitelist Entries.

这篇关于什么是Mongoose(或MongoDB)中的TransientTransactionError?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆