节点PostgreSQL的如何防范交易从正在中止

时间:2019-02-01 19:51:28

标签: node.js postgresql

我正在使用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。有什么方法可以防止发生查询错误时交易中止?

1 个答案:

答案 0 :(得分:2)

这是默认行为,因为它是整个事务的重点。如果您不希望查询1,2,3全部成功或全部失败,那么您可能不希望它们在同一事务中进行。

但是,如果您想要的实际上是“ 1和(2或3)”,则应在查询1后放置SAVEPOINT,并在查询2错误时回滚到该保存点。