2016-11-22 88 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.insertutil.mark採取IO操作,它們能夠更好地接受trx作爲參數。