Транзакция отката вызова в другой функции - Node + KnexJS - PullRequest
0 голосов
/ 11 марта 2020

У меня есть транзакция, которая выполняет вставку в моей базе данных, но мне нужно выполнить другую более простую вставку, и я хотел бы вызвать откат транзакции, если во второй вставке есть ошибка.

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 должен иметь псевдоним

1 Ответ

0 голосов
/ 12 марта 2020

Вы используете транзакции неправильно. Когда вы возвращаете Promise из функции обработчика транзакций, вы никогда не должны явно вызывать trx.commit () / trx.rollback (). Также вы вызываете global 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...