【问题标题】:What is a TransientTransactionError in Mongoose (or MongoDB)?Mongoose(或 MongoDB)中的 TransientTransactionError 是什么?
【发布时间】:2018-09-03 16:32:32
【问题描述】:

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

我做错了什么?我找到了an article,但什么也做不了。

【问题讨论】:

  • @SagnikPradhan 我想在这里添加一件奇怪的事情。如果我在这里错了,我不会。我添加了从命令提示符(Ipconfig 命令)获得的 IP 地址,但它不起作用。但是,当我要求集群获取我的 IP 地址时,它获取了一个不同的 IP 地址,并且成功了。如果有人能解释原因,我觉得它会为上述问题增加一些内容。
  • @vibhorvaish 这可能是您的本地 IP 地址。

标签: javascript node.js mongodb mongoose


【解决方案1】:

我有

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

我在MongoDB网站的“主页>安全部分>网络访问>添加IP”之后将我当前的IP添加到白名单中。

我希望这会有所帮助。

【讨论】:

  • 这从字面上解决了上述错误。非常感谢!
【解决方案2】:

什么是 TransientTransactionError

TransientTransactionError 是一个被归类为临时的事务错误,如果重试它可能会成功。此外,当没有写入锁并且事务(新数据)没有反映在事务快照(以前的数据)中时,在提交之前会发生 TransientTransactionError 写入冲突。因此,这些错误可以完全安全地重试,直到出现是一个成功的提交。

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

牢记此错误标签不同于在获取锁但事务无法完成其提交时发生的提交错误。错误标签是 UnknownTransactionCommitResult。对此的引用是值得注意的,因为在理解您的应用程序中发生错误的位置以及可能的根本原因以及应用程序如何能够和/或将如何因不同的错误类型做出响应方面存在差异。

如果您使用的是MongoDB supported drivers,则代码出现此错误可能有两种原因:

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

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

如果错误信息为MongoNetworkError,则表示瞬时事务错误与客户端和服务器之间的网络连接有关。这可能是可重试的一次性网络故障,或者没有需要网络配置的网络访问。如果客户端第一次尝试访问服务器时遇到错误,则可能需要进行网络配置。如果服务器在 MongoDB Atlas 上,请参阅 Configure Whitelist Entries

【讨论】:

  • 我唯一要补充的是,transienttransactionerror 是对不在快照(以前的数据)上且在获取写锁定之前的事务的尝试。很可能是由于网络连接错误或写入冲突。将写入冲突视为由于某些情况而不允许您写入或获取写入锁的事情......即在进行任何形式的提交之前。
【解决方案3】:

如果没有安全问题,而您只是为了连接: 设置IP白名单时;格式应该是 0.0.0.0/0 ,你不会遇到这个问题。

此外,正如您自己回答的那样,我们可以添加我们需要访问的ip。

【讨论】:

    【解决方案4】:
    1. 转到您的 mongoDB Atlas 仪表板
    2. 打开网络访问(在侧导航栏中)
    3. 点击添加 IP 地址
    4. 点击从任何 IP 地址允许(它基本上可以访问您的动态 IP 地址)

    现在你已经完成了。

    【讨论】:

    • 我第一次尝试连接时遇到了同样的问题,谢谢!
    【解决方案5】:

    我遇到了同样的问题/错误,尽管是在 Windows 机器上。尽管我以为我已经启动了 mongodb 服务,但我没有看到它在 Windows 服务中运行。因此,我在 Services 中手动启动了 mongoDB 服务,然后错误就消失了。希望这会有所帮助!

    【讨论】:

      【解决方案6】:

      我在 Express/NodeJS 的 MDN 教程中运行 populatedb.js 脚本时遇到了这个错误。

      该脚本正在寻找以mongodb:// 开头的数据库连接,但是我来自mongo 的连接字符串以mongodb+srv:// 开头。

      我编辑了脚本以检查此语法,从而解决了错误。

      我希望这对某人有所帮助。

      【讨论】:

        【解决方案7】:

        我有类似的问题... 一整天我都能通过猫鼬连接。然后砰我开始收到“TransientTransactionError”错误。我可以通过 shell 连接到 mongoDB,因此我知道服务器已按预期启动并运行。

        IPv6/本地主机。我的 IP 从 IPv4 切换到 IPv6。我通过禁用 IPv6 并获取常规 IPv4 IP 解决了这个问题。

        编辑——当我的网卡配置了 IPv6 IP 时,我似乎可以通过连接到“localhost”可靠地重新/创建这个问题。更改 localhost->127.0.0.1 似乎可以解决问题。

        【讨论】:

        • 什么?您的 IP 是如何从 IPv4 切换到 IPv6 的? :/ 你是如何“禁用 IPv6”的?
        • @Bloke - 我通过手机移动热点连接获得 IPv6 IP。我使用 sysctl 禁用 IPv6(有关详细信息,请参阅 google)。
        【解决方案8】:

        确保服务器没有耗尽存储空间

        就我而言,建议的答案都没有帮助。我一直在拔头发,直到我注意到服务器存储空间不足。清理几兆字节的存储空间立即解决了错误。

        TransientTransactionError 在这种情况下实际上是有意义的,因为它的性质是一个临时错误,可以通过显式重试来解决 - 尽管我确实花了一段时间才弄清楚它与存储问题有关。

        【讨论】:

          【解决方案9】:

          对我来说,每当我从 wifi 网络切换到手机热点时,都会出现短暂的交易错误。如果您也遇到这种情况,请访问您创建数据库的 MongoDB 网站,并再次将您当前的 IP 地址列入白名单。这将解决您的问题。

          【讨论】:

            【解决方案10】:

            如果您使用的是 MongoDB Atlas。您需要在 Atlas 控制台的安全设置中将您的 IP 地址列入白名单。

            【讨论】:

              【解决方案11】:

              如果你仍然有这个错误,另一个原因是你在更改配置文件后忘记重新启动 nodemon 服务器。 CTRL+C 重新开始,我就是这样解决的。

              【讨论】:

                【解决方案12】:

                安全>网络访问>添加IP地址>添加当前计算机IP地址。 解决了我的问题。

                【讨论】:

                  【解决方案13】:

                  使用 mLab -- 创建集群时,您需要添加数据库用户(在用户选项卡下)并确保不要单击 Make read-only 复选框。一旦我这样做了,错误就消失了。我遇到了与上面相同的错误。数据库用户可以是您的登录用户名和密码。

                  【讨论】:

                  • 感谢您的回答!您能否详细说明问题发生的原因,以及为什么您的答案解决了问题?
                  【解决方案14】:

                  转到您的 MongoDb Atlas 仪表板。单击网络访问,单击添加 IP 地址并允许从任何 IP 地址进行连接。 这应该可以解决您的问题。

                  【讨论】:

                  • 以及引入安全问题。请不要这样做。
                  【解决方案15】:

                  我在尝试将 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上将服务器连接列入白名单后,数据库连接错误得到解决。

                  【讨论】:

                    【解决方案16】:

                    您可以在线阅读有关该错误的信息,但解决此问题的方法是:转到您的 MongoDB 地图集并添加您的 IP 地址

                    转到: 主页>安全部分>网络访问>添加IP

                    这个问题基本上是当架构不知道你自己的IP地址时。

                    另外,直接复制粘贴到谷歌以获得直接的解决方案。

                    【讨论】:

                      猜你喜欢
                      • 2019-07-04
                      • 2012-09-11
                      • 1970-01-01
                      • 2013-03-03
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2012-09-11
                      相关资源
                      最近更新 更多