web-dev-qa-db-ja.com

Mongoose(またはMongoDB)のTransientTransactionErrorとは何ですか?

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から3つの関数を呼び出します:

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

私は何を間違えていますか? 記事 を見つけましたが、何もできません。

17
Sagnik Pradhan

TransientTransactionErrorとは

TransientTransactionErrorは一時的なものとして分類されるトランザクションエラーであり、再試行した場合は成功する可能性があります。さらに、書き込みロックが取得されておらず、トランザクション(新しいデータ)がトランザクションスナップショット(以前のデータ)に反映されていない場合、コミットの前にTransientTransactionError書き込み競合が発生します。そのため、これらのエラーは、成功したコミットです。

このシナリオで再試行するトランザクションは、トランザクションの最初から再試行されます。

留意してくださいこのエラーラベルは、ロックが取得されたがトランザクションがコミットを完了できないときに発生するコミットエラーとは異なります。このエラーラベルはUnknownTransactionCommitResultです。これへの参照は、アプリケーションのどこでエラーが発生しているのか、根本的な原因は何か、アプリケーションはさまざまなエラータイプによってどのように応答するのか、または応答するのかを理解しているため、注目に値します。

MongoDBがサポートするドライバー を使用している場合、コードでこのエラーが発生する可能性のある原因は2つあります。

  • 「errorLabels」フィールドに「TransientTransactionError」エラーラベルを含むデータベースコマンドエラー。
  • トランザクションで commitTransaction 以外のコマンドを実行すると、ネットワークエラーが発生しました。

MongoDB Transactions:retry-transaction のコード例は、TransientTransactionErrorの処理方法を示しています。

8
Wan Bachtiar

持っていた

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

MongoDB Webサイトの「メインページ>セキュリティセクション>ネットワークアクセス> IPの追加」に従って、現在のIPをwhiteListに追加しました。

これがお役に立てば幸いです。

24
gakeko betsi

Express/NodeJSのMDNチュートリアルでpopulatedb.jsスクリプトを実行すると、このエラーが発生しました。

スクリプトはmongodb://で始まるdb接続を探していましたが、mongoからの接続文字列はmongodb+srv://で始まりました。

代わりにこの構文をチェックするようにスクリプトを編集し、エラーを解決しました。

これが誰かの役に立つことを願っています。

3
Blake Simeon

Windowsマシンでも同じ問題/エラーが発生しました。 mongodbサービスを開始したと思っていたとしても、Windowsサービスで実行されているのを見ませんでした。そのため、サービス内でmongoDBサービスを手動で開始すると、エラーはなくなりました。お役に立てれば!

3
Benny

私は同様の問題を抱えていました...一日中、マングース経由で接続できました。その後、「TransientTransactionError」エラーが発生し始めました。シェル経由でmongoDBに接続できたため、サーバーが期待どおりに稼働していることがわかりました。

IPv6/localhost。 IPがIPv4からIPv6に切り替わりました。 IPv6を無効にし、通常のIPv4 IPを取得することで問題を解決しました。

編集-NICがIPv6 IPで構成されている間に 'localhost'に接続することにより、この問題を確実に再作成/作成できるようです。 localhost-> 127.0.0.1を変更すると、問題が解決するようです。

2
terary

セキュリティ上の問題がなく、接続のためだけにそれをしている場合:IPホワイトリストの設定中。形式は0.0.0.0/0である必要があり、問題に直面することはありません。

enter image description here

さらに、あなた自身が答えたように、アクセスが必要なIPを追加できます。

2
Singh Gaurav

ここでは、MongoNetworkErrorおよびTransientTransactionErrorと表示されます。これらは、MongoDBへの接続中にエラーが発生したことを示しています。これらのエラーは次の原因で発生する可能性があります。

1。接続文字列が間違っています
2。IPアドレスはホワイトリストに登録されていません(リモートdbサービスを使用している場合)

その他のリソース: https://docs.mongodb.com/manual/core/transactions/#retry-transaction

1
Sagnik Pradhan

このエラーが引き続き発生する場合、別の理由は、構成ファイルを変更した後にnodemonサーバーを再起動するのを忘れたことです。 Ctrl + Cを押してもう一度開始します。これが解決方法です。

1
Marko Filipovic

私にとって、一時的なトランザクションエラーは、wifiネットワークから携帯電話のホットスポットに切り替えるたびに発生しました。この問題が発生した場合は、データベースを作成したMongoDB Webサイトにアクセスし、現在のIPアドレスを再度ホワイトリストに追加してください。これで問題が解決します。

1
Tarun

MLabの使用-クラスターが作成されたら、(ユーザータブの下に)データベースユーザーを追加し、Make read-onlyチェックボックスをクリックしないようにする必要があります。これを行うと、エラーはなくなりました。上記と同じエラーが発生していました。データベースユーザーは、ログインユーザー名とパスワードにすることができます。

1
Jared Stevens

MongoDb Atlasダッシュボードに移動します。 [ネットワークアクセス]をクリックし、[IPアドレスの追加]をクリックして、任意のIPアドレスからの接続を許可します。これで問題が解決するはずです。

0
AMADI AUSTIN

MongoDB Atlasを使用している場合。セキュリティ設定のAtlasコンソールでIPアドレスをホワイトリストに登録する必要があります。

0
HassanK

[セキュリティ]> [ネットワークアクセス]> [IPアドレスの追加]> [現在のコンピューターのIPアドレスの追加]。私の問題を解決しました。

0
tanvirgeek

HerokuアプリをMongoDB Atlasデータベースに接続しようとしたときに、この問題が発生しました。

On youターミナルを実行する場合

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でサーバー接続をホワイトリストに登録した後、データベース接続エラーは解決されました。

0
Yvan Pearson