一尘不染

猫鼬(或MongoDB)中的TransientTransactionError是什么?

node.js

我有server.jsdb.jsdb.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)]: {} }

我究竟做错了什么?我找到了一篇文章,但什么也做不了。


阅读 763

收藏
2020-07-07

共1个答案

一尘不染

什么是TransientTransactionError

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

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

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

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

  • 在“ errorLabels”字段中包含“ TransientTransactionError”错误标签的任何数据库命令错误。
  • 在事务中运行除commitTransaction以外的任何命令时遇到任何网络错误。

MongoDB
Transactions中
的代码示例:retry-
transaction
显示了如何处理TransientTransactionError

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

2020-07-07