何时使用Knex transacting()与链结trx对象

Mar*_*yer 3 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');
    });
    });
})
Run Code Online (Sandbox Code Playgroud)

在SO上,我看到了广泛使用函数transacting()的示例,如下所示:

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

Knex transacting()用类似于上面的示例描述:

knex.transaction使用该事务处理方法,它可以链接到任何查询,并传递您希望加入该查询的对象作为事务的一部分。

我的问题是:

是什么区别trx.insert().into('foo')knex('foo').transacting(trx).insert()你为什么要使用一个,而不是其他?

coo*_*koo 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)
    }))
})
Run Code Online (Sandbox Code Playgroud)

真的不知道其他方法的特定用法。这可能只是样式问题。您有两个接口,可以选择最喜欢的一个。至于我,我习惯了.transacing(trx)

  • 这确实是一个风格问题。使用 `.transacting()` 是旧方法,使用类似 knex 实例的 `trx` 是新方法。添加后一种方法是为了更难忘记为查询设置事务,这很难发现错误。所以通常应该使用`trx('table').insert(...)` 样式。 (3认同)