Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript knex中的平行交易_Javascript_Knex.js - Fatal编程技术网

Javascript knex中的平行交易

Javascript knex中的平行交易,javascript,knex.js,Javascript,Knex.js,有没有办法让事务并行工作 捏 一个权宜之计是启用连接池并使用 但是,并行解决方案无法处理事务 事务需要在同一连接上执行其所有查询,因此调用Promise.all()在不作为事务的一部分执行时是快速的,而在作为事务的一部分执行时是缓慢的 // can be called as part of a transaction, or not getAllData: function(trx) { return new Promise((resolve, reject) => { l

有没有办法让事务并行工作

  • 一个权宜之计是启用连接池并使用
但是,并行解决方案无法处理事务 事务需要在同一连接上执行其所有查询,因此调用
Promise.all()
在不作为事务的一部分执行时是快速的,而在作为事务的一部分执行时是缓慢的

// can be called as part of a transaction, or not
getAllData: function(trx) {
  return new Promise((resolve, reject) => {
    let data = {};

    Promise.all([
      getFoo(trx), // knex query using `trx` as the knex instance
      getBar(trx)  // knex query using `trx` as the knex instance
    ]).then((result) => {
      data.foo = result[0];
      data.bar = result[1];

      resolve(data);
    }).catch((err) => {
      reject(err);
    })
  });
}
我可以使用
knex.raw()
一次完成实际的多语句查询,但这会将DB调用与DB耦合起来,从而消除knex作为DB抽象层的附加值,您可以使用它来构建查询,然后将这些查询与
连接起来
,然后使用
knex.raw()
以原始模式执行它们

要在没有连接的情况下使用Knex,可以传递一个空对象作为初始配置,然后编写查询,然后对其调用
.toString()
,以获得实际的原始查询

const knex = require('knex')({});
let query = knex('users').insert({id: 10, name: 'Amir'}).toString();
console.log(query);
// insert into "users" ("id", "name") values (10, 'Amir')
如果需要,您可以拥有一个knex查询数组。对所有对象调用
.toString()
,并使用
加入结果数组应该能满足您的需要

const knex = require('knex')({});

let queries = [
    knex('users').insert({id: 10, name: 'Amir'}),
    knex('blogs').insert({user_id: 10, title: 'My New Blog'}),
    knex('configs').insert({user_id: 10, key: 'value'})
];

let query = queries.map(q => q.toString()).join('; ');
console.log(query);
// insert into "users" ("id", "name") values (10, 'Amir'); insert into "blogs" ("title", "user_id") values ('My New Blog', 10); insert into "configs" ("key", "user_id") values ('value', 10)
以下是一个解决方案:

//可以作为事务的一部分调用,也可以不调用
getAllData:函数(trx){
返回新承诺((解决、拒绝)=>{
getFoo(trx)//knex查询使用'trx'作为knex实例
.然后((foo)=>{
返回getBar(trx)//knex查询,使用'trx'作为knex实例
。然后((条)=>{
解析({foo,bar});
});
},拒绝);
});
}
它甚至可能很简单:

//可以作为事务的一部分调用,也可以不调用
getAllData:函数(trx){
返回getFoo(trx)//knex查询,使用'trx'作为knex实例
.然后((foo)=>{
返回getBar(trx)//knex查询,使用'trx'作为knex实例
。然后((条)=>{
返回{foo,bar};
});
},拒绝);
}

你好。你能给我们举个例子吗?酷。在我看来,这应该得到Knex的支持,无论如何,我认为这将正常工作。赞成票:)是的,但不是交易这些不是平行交易。事实上,我认为这个问题的前提是错误的。您不能在DB级别执行并行事务。没错,Knex不能执行并行事务,我只是提出了一个解决方案来避免错误,那就是使用队列创建承诺。