我正在使用pg/transaction处理一个复杂的过程。可以这样简化:
async() => {
const client = await new Pool().connect();
try {
await client.query("BEGIN");
await client query("query 1");
try {
await client query("query 2");
// Some error happen
} catch(err) {
console.log(err);
}
await client query("query 3");
await client query("COMMIT");
} catch(err) {
await client.query("ROLLBACK");
} finally {
client.release
}
}
问题在于,当query2返回错误时,即使我不回滚该进程,客户端也无法执行query3。它返回该错误是current transaction is aborted, commands ignored until end of transction block
。有什么方法可以防止发生查询错误时交易中止?
答案 0 :(得分:2)
这是默认行为,因为它是整个事务的重点。如果您不希望查询1,2,3全部成功或全部失败,那么您可能不希望它们在同一事务中进行。
但是,如果您想要的实际上是“ 1和(2或3)”,则应在查询1后放置SAVEPOINT
,并在查询2错误时回滚到该保存点。