Проблема отката транзакции с knex - PullRequest
0 голосов
/ 25 июня 2019

Я пытаюсь выполнить транзакции mysql, используя knex в узле js. Мои транзакции SQL выглядят так

1- Проверьте, существует ли название компании, если да, то выведите сообщение об ошибке и сделайте откат транзакции.

2- Проверьте, существует ли адрес электронной почты, если да, то выведите сообщение об ошибке и сделайте откат транзакции.

3- Вставить в таблицы user, company и userroles и, если произошла ошибка, откат транзакции.

Теперь я наблюдаю, что если ошибка возникает внутри вложенного, то особенно последнего, тогда транзакция не откатывается, а фиксирует предыдущие транзакции.

Вот мой код функции

return knex.transaction(function(t){
        return knex('company').where({ companyname: companyname }).select('companyid')
        .then(function(rows){
            if(rows.length >= 1)
                return Promise.reject('company already exist');
            return knex('Users').where({email: emailaddress}).select('userid')
        })
        .then(function(rows){
            if(rows.length >=1 )
                    return Promise.reject('user already exist');

            return knex('Users').insert({username:username,email:emailaddress,passsword:password,creationtime:'2008-11-11 13:23:44',updationtime:'2008-11-11 13:23:44'},'userid')

        })
        .then(function(useridreturned){
            userid=useridreturned;
            return knex('company').insert({companyname:companyname,companytokens:100})

        })
        .then(function(companyidreturn){
            companyid=companyidreturn;
            return knex('userroles').insert({userid:userid[0],roleid:1,companyid:companyid[0]},'userrolesid')

        })
        .then(function(result){
            return Promise.resolve('Account Created');
        })
        .then(t.commit)
        .catch(t.rollback)


  })


Я что-то здесь не так делаю?

1 Ответ

1 голос
/ 27 июня 2019

При использовании транзакций с knex вы должны указывать каждому запросу, что он должен идти к данной транзакции.

Таким образом, вместо того, чтобы делать knex('table').insert({...}}) (который выделил новое соединение из пула), вы должны написать t('table').insert({...}}), который отправит запрос соединению, в котором происходит транзакция.

Также, если вы возвращаете обещание от

knex.transaction(trx => {
  return trx('table').insert({...});
})

Вы не должны вызывать явные trx.commit() / trx.rollback() те, которые неявно вызываются knex со значением result / reject возвращенного обещания.

...