knex事务在nodejs中不起作用

时间:2017-12-15 13:35:10

标签: mysql node.js loopbackjs knex.js

我在环回中使用knex来使用mysql进行数据库操作。 我的任务是使用事务更新2表。 当我在一个tabe中输入新条目时,我想使用该条目的id进行第二次查询操作。

但是当事务抛出错误时,如果第二个表项引发错误,则不会回滚数据/删除第一个表项。但在我的情况下,事务总是提交不回滚我把我的示例代码放在下面:

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);
    }); 
  });
}
请给我合适的建议。 谢谢

1 个答案:

答案 0 :(得分:0)

您可以避免自己致电t.committ.rollback。见the docs

在交易功能中使你的代码像这样

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

这使得knex可以根据该promise的结果处理提交和回滚本身。另外,请注意我如何插入fooId并将其应用于bar对象的insert对象。在问题中提到了这一点。