2016-11-22 11 views
0

関数を使用する場合、knexでトランザクションを実装する方法は? util.insertはtable2上でknexを呼び出し、同様にutil.markを呼び出します。knexでトランザクションを実装する方法は?

knex('tab1').where({ col1: 'val1' }).update({ col2: 'val2'}).returning('col3').then(function(result1) { 
        if (result1 != 0) { 
         var data2 = { 
          "key": "value" 
         }; 
         util.insert(data1, function(err1, data2) { 
          if (err1) { 
           cb(err1); 
           return; 
          } 
          util.mark(data2, function(err2, data3) { 
           if (err2) { 
            cb(err2); 
            return; 
           } 
           cb(null, true); 
           return; 
          }); 
         }); 
        } else { 
         cb(null, false); 
        } 
       }) 

答えて

1
knex.transaction((trx) => { 
    return knex('tab1') 
    .update({ col2: 'val2' }) 
    .where({ col1: 'val1' }) 
    .transacting(trx) 
    .then((result) => { 
    let promise; 
    if (result1 != 0) { 
     promise = util.insert(data1); 
    } else { 
     promise = util.mark(data2); 
    } 
    return promise 
    .transacting(trx); 
    }) 
    .then(trx.commit) 
    .catch(trx.rollback) 
}) 
.then(() => { 
    // blabla 
}) 
.catch((err) => { 
    // handle your error together 
}); 

util.insertまたはutil.markはIO操作を取る場合、彼らはより良い引数としてtrxを受け入れます。

関連する問題