2017-10-11 21 views
1

この単純なクエリを想定します。データベース接続がクローズされた場合、またはデータベースサーバがすぐにクエリを実行していない場合はどうなりますか

var knex = require("knex")(knexConfig); 
    var insert1 = {col1: "a4", col2: "b4", col3: "c4"}; 

    knex.insert(insert1).into("test").then(function (id) { 
     console.log(id); 
    }) 
    .finally(function() { 
     knex.destroy(); 
    }); 

挿入クエリを実行した直後にデータベースサーバーがダウンしているか接続が終了した場合はどうなりますか?データを格納してエラーを返すか、データを格納せずエラーを返しますか?

+1

挿入することもあれば挿入しないこともできます。それはエラーを送信したり、エラーを送信することがあります。 –

+0

返信ありがとうございます。その場合、どのようにバックエンドがそのようなケースを処理する必要がありますか? – UserBH

+0

@UserBHその意味は不明です。バックエンドがデータベースの場合、それはケースを開始した、それを '処理'する必要はありません。それがアプリケーションの場合、エラーを受け取らない場合、アプリケーションは処理できません。 – EJP

答えて

0

挿入クエリが実行されても、結果がクライアントにまだ送信されていない場合、データはDBに保存されますが、knexは接続を失います。

これがトランザクションで実行された場合、データは格納されず、knexは同じ種類のエラーを送出します。

この場合、トランザクションで挿入を行うと、エラーが発生した場合はデータがDB内にないことがわかります...しかし、DBに行を追加した後結果がREST呼び出しに戻りません。エラーがあったため、フロントエンドはデータが挿入されたかどうかを再度確認できません。

このようなケースを処理する最良の方法は、すべてが成功し、エラーがあった場合、データが追加されたかどうかを確認する必要があります。同じデータが2回転記されないことが重要である場合は、データベーススキーマにいくつかの制約があることを確認してください)。

+0

実生活では、トランザクションを冪等にする必要があります。チェックは必要ありません。 – EJP

+0

私はポイントを得た。助けてくれてありがとう。 – UserBH

+0

@EJP私の答えの最後の部分は、あまりにも言いましたが、より多くの言葉で –

関連する問題