【发布时间】:2020-01-15 22:27:22
【问题描述】:
我在节点 js 10.x 中使用 knex 0.19.4。我有 2 个 SQL 语句 - 插入和更新必须作为事务发生。
// Using Var, so that below code has access to this variable
var sqlStageInsert = kx('stage').insert({
officeid: 'OFF000',
taskid: 'T002',
});
var sqlTaskPcUpdate = kx('task')
.update({ pc: 100})
.where('task.taskno', taskno)
.limit(1);
第一次尝试 - 第二次 SQL sqlTaskPcUpdate 未执行
const sqlUpdateInsert = kx.transaction(function (trx) {
sqlStageInsert.transacting(trx)
.then(function () {
console.log(sqlTaskPcUpdate.toString()); // This is outputing correct SQL
return sqlTaskPcUpdate.transacting(trx);
})
.then(trx.commit)
.catch(trx.rollback);
});
await sqlUpdateInsert;
第二次尝试 - 出现错误 Transaction query already complete。这是基于Commit/rollback a knex transaction using async/await
await kx.transaction(async (trx) => {
try {
await sqlStageInsert.transacting(trx);
await sqlTaskPcUpdate.transacting(trx);
trx.commit();
} catch (error) {
trx.rollback();
throw error;
}
});
【问题讨论】:
-
.transaction看起来是基于回调的,而不是基于 Promise 的..? -
它看起来仍然是基于回调的?你确定
.transaction返回一个 Promise 吗? -
是的,
.transaction返回 Promise
标签: mysql node.js transactions knex.js