2016-09-09 44 views
0

したがって、nodejs sqliteライブラリ(https://github.com/mapbox/node-sqlite3)を使用すると、db.serialize関数を使用してsqlトランザクションをシリアル化できます。この関数内のすべての実行は、指定された順序で実行されます。 しかし、forループを使用すると、トランザクションに関する情報をどのように取得して成功または失敗にすることができますか?nodejsのSqliteトランザクション

function transaction(callback) { 
    db.serialize(function() { 
     db.run("BEGIN"); 

     for(...) { 
      db.run("INSERT", function(err) { 
       //this code is not serialized with the parent serialize function (this is my problem) 
       //if one run throw error i must resolve the callback with the error code 

       if (err) 
        callback("error"); 
      }); 
     } 

     db.run("END"); 

     callback("ok"); 
    } 
} 

答えて

0

トランザクションを開始する前に、いくつかの変動を定義することができます。 var results = [];。コールバック内の各クエリを完了すると、エラーまたはヌルをresults.push(err)として収集し、results.lengthをチェックすることができます。 results.lengthforの長さに等しい場合、すべてのクエリが実行され、results.every((i) => i === null)の値がチェックされます。 trueの場合commit else rollbackを実行します。


フローを制御するほうが、非同期モジュールを使用するほうがずっと優れています。

'use strict' 
var async = require('async'); 
... 
db.run('begin', function(err){ 
    if (err) 
     return console.log(err); 

    let run = (sql, callback) => db.run(sql, callback);  
    async.eachSeries(sqls, run, function(err){ 
     db.run((err) ? 'rollback' : 'commit', ...) 
    }) 
}) 

beginをsqlsに追加すると、コードがよりシンプルになります。

+0

ありがとう:)あなたの解決策の問題は、1つの接続に対して1つのスレッドだけが関数を呼び出すことができます。それ以外の場合、「トランザクションのトランザクションエラー」が発生します。 – user2957271

関連する問題