2016-11-22 9 views
0

Как реализовать транзакцию в knex, если используются функции? util.insert вызывает knex на table2 и аналогично 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 в качестве аргументов.