当前位置: 首页 > 面试题库 >

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

严阳秋
2023-03-14
问题内容

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

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


问题答案:

什么是TransientTransactionError

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

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

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

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

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

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

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



 类似资料:
  • 问题内容: 我正在使用版本3和2.2。我注意到一个字段已经开始出现在我的文档中。与版本控制有关吗?如何使用? 问题答案: 从这里: 该是对每个文档设置时,首先由猫鼬创建一个属性。此键值包含文档的内部修订版。此文档属性的名称是可配置的。默认值为。 如果这与您的应用程序冲突,则可以这样配置:

  • 我正在使用MongoDB版本2.2的版本3。我注意到一个字段开始出现在我的文档中。它与版本控制有关吗?它是如何使用的?

  • 问题内容: 我是Node.js,Mongoose和Expressjs的新手。我试图通过以下代码在MongoDB中使用Mongoose创建一个表“ feedbackdata”。但是它被创建为“ feedbackdata * s *”。通过谷歌搜索,我发现猫鼬使用了复数规则。任何人都可以帮助我删除复数规则吗?或“ feedbackdata”表的代码应如何? 下面是我的代码: }); 问题答案: 该文件

  • 问题内容: 我想浏览Mongoose存储在Mongodb中的原始数据。去哪儿了?我有一个名为Profile的模式,其中存储了多个配置文件,但是使用Mongodb shell ,并且不返回任何内容。 架构 问题答案: 使用Mongoose时的默认集合名称是小写的复数模型名称。 因此,如果要为as 创建模型: 集合名称是; 因此您将在shell中找到其内容。 请注意,如果您不喜欢默认行为,则可以提供自

  • 问题内容: 我是mongodb的超级新手。我正在使用猫鼬从node.js访问mongodb,并且知道如何使事情工作,但是我不认为我为什么理解它的工作方式。 最重要的是,当mongodb的突出特征之一是它没有模式时,我不明白为什么猫鼬会具有“模式”。有人可以启发我吗?谢谢。 问题答案: 没有模式的数据是无用的。您从MongoDB获得文档,该怎么做?阅读一些领域?您需要知道这些字段的名称,类型和含义。

  • 问题内容: 假设我有一些Schema,其中有一个像这样的虚拟字段 在查询中是否可以按虚拟字段对结果进行排序?就像是 当我尝试此操作时,结果很简单,无法排序… 问题答案: 您将无法按虚拟字段进行排序,因为它们没有存储到数据库中。 虚拟属性是很方便使用的属性,但不会持久存在于mongodb中。 http://mongoosejs.com/docs/2.7.x/docs/virtuals.html