2017-12-15 21 views
0

mysqlでのDB操作でループバックでknexを使用しています。 私の仕事は、トランザクションを使用して2テーブルを更新することです。 新しいエントリを1つのタブに入力すると、そのエントリのIDを2番目のクエリ操作に使用します。nodejsでknexトランザクションが動作しません

トランザクションがエラーをスローすると、2番目のテーブルエントリがエラーをスローすると、最初のテーブルエントリを削除してデータをロールバックしません。 、

addTest : (data) => { 
    return new promise(function(resolve, reject) { 
    knex.transaction(function(t) { 
     return knex('foo') 
     .transacting(t) 
     .insert({ 
      foo_id: data.foo_id ? data.foo_id : null, 
      foo_name: data.foo_name ? data.foo_name : null, 
      date_entered : new Date() 
     }) 
     .then(function() { 
      return knex('bar') 
      .transacting(t) 
      .insert({ 
      bar_id: data.bar_id ? data.bar_id : null, 
      bar_name : data.bar_name ? data.bar_name : null 
      }) 

     }) 
     .then(t.commit) 
     .catch(function(e) { 
      t.rollback(); 
      throw e; 
     })  
    }) 
    .then(function() { 
    // it worked 
    // resolve('sucess'); 
    console.log('success'); 
    }) 
    .catch(function(e) { 
    // it failed 
    console.log('error'+e); 
    }); 
    }); 
} 

してください私に適した提案を提供していますが、私の場合のトランザクションで、常に私は以下の私のコード例を入れてロールバックできませんコミットありません。 ありがとう

答えて

0

t.commitまたはt.rollbackあなた自身を呼び出すことを避けることができます。 the docsを参照してください。

トランザクション関数内knexがコミットを処理し、その約束の結果結果に基づいてバック自体ロールすることができます。この

return t.insert({}).into('foo').returning('id') .then(function(idArray) { return t.insert({fooId: idArray[0]}).into('bar') })

のようなものをあなたのコードを作成します。また、どのように私はfooIdinsertイオンのオブジェクトに適用されていることに注意してください。それは問題の中で言及されたもののようなものでした。

+0

未定義のバインディングは、列がデータベースにないためです。クエリは挿入できません。残りの部分は、そのエラー(およびあなたのDBテーブルの定義)を取得するために使用しているコードを見ずには分かりません。 – clay

+0

私のコードは上記で宣言されています –

+0

'knex.transaction(function(t) {'あなたのものと同じように、プロミスを返します。自動的に' t.commit'と 't.rollback'を呼び出します。あなたの2番目のクエリで最初に挿入されたidを使用していない)。t.commit''t.rollback'を自分で呼び出し、約束を返さないで、約束を返し、Knexにトランザクションの解決を任せます。 – clay

関連する問題