调用其他函数中的回滚事务-Node+KnexJS



我有一个事务在数据库中执行插入,但我需要执行另一个更简单的插入,如果第二个插入中出现错误,我想调用事务回滚。

await knex.transaction(async trx => {                
const queries = []
for(const dadoResultado of dadoResultados.dados){
const query = app.db.raw(`
insert into dadoResultados
...
`)
.transacting(trx)
.catch(err => res.status(500).send(err.message))
queries.push(query)
}
await Promise.all(queries)
.then(trx.commit)
.catch(trx.rollback)
})
await app.db.raw(`
INSERT INTO resumoacompanhamentos (num, value)
values (13, 50)
`)

代码修改:

try{
await app.db(async trx => {
for(const data of values.dados){
await trx.raw(`
insert into values(code_inst, money, subscription, version, first_name)
select
b.code_inst,    
b.money
p.subscription,    
a.version,                  
b.first_name
from (VALUES (${data.code_inst}, ${data.money}, ${data.first_name}) b(code_inst, money, first_name)
inner join table_P as p
on p.code_inst = b.code_inst
AND p.version = b.version
AND p.code_inst = b.code_inst
left join table_A AS a
on a.subscription = p.subscription
`)        
}
const sum_value_final = await app.db.raw(`
SELECT 
SUM(money) AS money
FROM values
WHERE first_name = ${first_nameFile}
AND subscription = ${values.dados[0].subscription}
`)
const sumValues = await sum_value_final.rows[0]
await app.db.raw(`
INSERT INTO resume_table (code_inst, subscription)
values (${sumValues.dados[0].code_inst}, ${sumValues.dados[0].subscription)
`)                            
})
} catch(err){
res.status(500).send(err.message);
}

错误二:

select*from(select*(-from中的子查询必须有一个别名

您错误地使用了事务。当你从事务处理程序函数返回Promise时,你永远不应该显式调用trx.commit((/trx.rollback((。此外,你调用全局knex来获取事务的连接,然后使用app.db.raw来运行查询,这真的很奇怪。。。

无论如何,你想这样做吗:

try {
await app.db.transaction(async trx => {                
for(const dadoResultado of dadoResultados.dados){
await trx.raw(`
insert into dadoResultados
...
`);
}
await trx.raw(`
INSERT INTO resumoacompanhamentos (num, value)
values (13, 50)
`)
});
} catch (err) {
res.status(500).send(err.message);
}

最新更新