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);
});
});
}
してください私に適した提案を提供していますが、私の場合のトランザクションで、常に私は以下の私のコード例を入れてロールバックできませんコミットありません。 ありがとう
未定義のバインディングは、列がデータベースにないためです。クエリは挿入できません。残りの部分は、そのエラー(およびあなたのDBテーブルの定義)を取得するために使用しているコードを見ずには分かりません。 – clay
私のコードは上記で宣言されています –
'knex.transaction(function(t) {'あなたのものと同じように、プロミスを返します。自動的に' t.commit'と 't.rollback'を呼び出します。あなたの2番目のクエリで最初に挿入されたidを使用していない)。t.commit''t.rollback'を自分で呼び出し、約束を返さないで、約束を返し、Knexにトランザクションの解決を任せます。 – clay