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不能执行并行事务,我只是提出了一个解决方案来避免错误,那就是使用队列创建承诺。