何时使用Knex transacting()vs链接trx对象

时间:2017-10-18 07:34:08

标签: javascript database postgresql transactions knex.js

Knex的交易文档包含如下代码:

knex.transaction(function(trx) {
    var books = [
        {title: 'Canterbury Tales'},
        {title: 'Moby Dick'},
        {title: 'Hamlet'}
    ];

    return trx
    .insert({name: 'Old Books'}, 'id')
    .into('catalogues')
    .then(function(ids) {
    return Promise.map(books, function(book) {
        book.catalogue_id = ids[0];

        // Some validation could take place here.

        return trx.insert(info).into('books');
    });
    });
})

在这里,我已经看到广泛使用函数transacting(),其示例如下所示:

knex.transaction(function(trx) {
   knex('foo')
  .transacting(trx)
  .insert({id:"bar", username:"bar"})
  // etc
 })

Knex使用与上述类似的示例描述了transacting()

  

由knex.transaction使用,交易方法可以链接到任何查询,并作为交易的一部分传递您希望加入查询的对象。

我的问题是:

trx.insert().into('foo')knex('foo').transacting(trx).insert()之间的区别是什么?为什么要使用其中一个而不是另一个?

1 个答案:

答案 0 :(得分:5)

如果要在同一事务中执行多个操作,可以方便地使用.transacting(trx)

knex.transaction(function (trx) {
    return Promise.all([
        knex('foo').insert({ name: 'My Name' }).transacting(trx),
        knex('bar').insert({ field: 'Value' }).transacting(trx)
    ])
    // ---- or something like ----
    return Promise.all(SOME_INPUT_VALUES.map(function (value) {
        return knex('foo_bar').update('lul', value.lul).where('id', value.id).transacting(trx)
    }))
})

不知道其他方法的特定用法。这可能只是风格问题。你有两个接口,你可以选择一个你最喜欢的。至于我,我曾经.transacing(trx)