knex 的事务回滚问题
Transaction rollback issue with knex
我正在尝试在节点 js 中使用 knex 进行 mysql 交易。我的 SQL 笔交易看起来像这样
1-检查公司名称是否存在,如果存在则提示错误并回滚交易。
2-检查邮箱地址是否存在,如果存在则提示错误并回滚交易。
3- 插入用户、公司和用户角色表,如果遇到错误回滚事务。
现在我观察到,如果在嵌套内部发生错误,尤其是最后一个,则事务不会回滚,而是提交以前的事务。
这是我的功能代码
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)
})
我是不是做错了什么?
在 knex 中使用事务时,您需要告诉每个查询它应该转到给定的事务。
因此,与其执行 knex('table').insert({...}})
(从池中分配新连接),不如编写 t('table').insert({...}})
,它将查询发送到正在进行事务的连接。
此外,如果您要返回
的承诺
knex.transaction(trx => {
return trx('table').insert({...});
})
您不得显式调用 trx.commit()
/ trx.rollback()
那些由 knex 隐式调用的返回承诺的结果/拒绝值。
我正在尝试在节点 js 中使用 knex 进行 mysql 交易。我的 SQL 笔交易看起来像这样
1-检查公司名称是否存在,如果存在则提示错误并回滚交易。
2-检查邮箱地址是否存在,如果存在则提示错误并回滚交易。
3- 插入用户、公司和用户角色表,如果遇到错误回滚事务。
现在我观察到,如果在嵌套内部发生错误,尤其是最后一个,则事务不会回滚,而是提交以前的事务。
这是我的功能代码
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)
})
我是不是做错了什么?
在 knex 中使用事务时,您需要告诉每个查询它应该转到给定的事务。
因此,与其执行 knex('table').insert({...}})
(从池中分配新连接),不如编写 t('table').insert({...}})
,它将查询发送到正在进行事务的连接。
此外,如果您要返回
的承诺knex.transaction(trx => {
return trx('table').insert({...});
})
您不得显式调用 trx.commit()
/ trx.rollback()
那些由 knex 隐式调用的返回承诺的结果/拒绝值。