如何在knex中实现事务?

时间:2016-11-22 15:22:12

标签: sql postgresql transactions knex.js

如果使用函数,如何在knex中实现事务? util.insert在table2上调用knex,类似于util.mark。

 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 个答案:

答案 0 :(得分: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作为参数。