【问题标题】:When to use Knex transacting() vs chaining off the trx object何时使用 Knex transacting() 与链接 trx 对象
【发布时间】:2018-03-30 00:27:33
【问题描述】:

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 使用,transacting 方法可以链接到任何查询,并传递您希望作为事务的一部分加入查询的对象。

我的问题是:

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

【问题讨论】:

    标签: javascript database postgresql transactions knex.js


    【解决方案1】:

    当你想在同一个事务中执行多个操作时,使用.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)

    【讨论】:

    • 这确实是风格问题。使用.transacting() 是旧方法,使用trx 像knex 实例是新方法。添加后一种方式是为了更难忘记为查询设置事务,这很难发现错误。所以通常应该使用trx('table').insert(...) 样式。
    猜你喜欢
    • 2023-03-14
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多