我正在编写一个多步骤knex事务,该事务需要在表中插入多个记录。这些记录中的每一个在插入之前都需要通过用Node编写的有效性检查。
我将批量执行有效性检查,然后一次插入所有内容,只是两条记录可能彼此无效。即如果我插入记录1,则记录2可能不再有效。
不幸的是,我似乎无法以事务感知的方式查询数据库。在第二条记录的有效性检查期间,我的查询(用于有效性检查)没有显示第一个插入项存在。
我使用的是trx
(事务)连接对象,而不是基础的knex
对象。我希望这样可以解决此问题,因为该事务连接对象应该可以接受承诺,但是事实并非如此。
await knex.transaction(async trx => {
/* perform validity checks and insert if valid */
/* Check the record slated to be created
* against the rules to ensure validity. */
relationshipValidityChecks = await Promise.all(
relationshipsToCreate.map(async r => {
const obj = {
fromId: r.fromId,
toId: r.toId,
type: r.type,
...(await relationshipIsValid( // returns an object with validity boolean
r.fromId,
r.toId,
r.type,
trx // i can specify which connection obj to use (trx/knx)
))
};
if (obj.valid) {
await trx.raw(
`
insert into t1.relationship
(from_id, to_id, type) values
(?, ?, ?)
returning relationship_key;
`,
[r.fromId, r.toId, r.type]
);
}
return obj;
})
);
}
当我输入两个有效但彼此无效的记录时,应插入第一个记录,第二个记录应返回无效错误。 relationshipIsValid
有点复杂,因此我省略了它,但是我确定它能按预期工作,因为如果我分别输入上述两个记录(即在两个不同的端点调用中),第二个记录将返回无效错误。
任何帮助将不胜感激。谢谢!