pg-promise:何时发送 BEGIN 和 COMMIT?

pg-promise: when are BEGIN and COMMIT sent?

这个问题是为了延迟优化。

在pg-promise中,when/how是使用事务时发送的BEGIN和COMMIT命令吗?

例如,如果有代码:

db.tx(t => {
    const query1 = t.none(...);
    const query2 = t.none(...);
})

BEGIN 命令是与第一个查询一起发送还是在单独的数据包中发送?同样,COMMIT命令是和第二个查询一起发送还是在之后发送?

换句话说,这笔交易需要 2、3 或 4 次往返?

我是图书馆的作者。

Will the BEGIN command be sent together with the first query or before, in a separate packet?

之前。

Will the COMMIT command be sent together with the second query or after?

之后。

Will this transaction take 2, 3, or 4 round trips?

4

Would you say that there is room for optimization, or that using a lower-level library could be beneficial (for latency)?

可能会有一些,具体取决于您要实现的目标。默认实现使其 easy/standard 处理事务逻辑,并记录所有发生的事情(参见 pg-monitor)。一切都在方法 tx 中进行了优化,这使得以安全的方式逻辑地处理任何情况变得容易。

如果您需要执行大量的微事务,那么您唯一想要优化它的情况,否则就性能而言不值得这样做。

在这种非常特殊的情况下,您可能希望通过将所有查询连接成一个查询来将整个事务作为单个查询来执行。为此,有一种方法 helpers.concat 可帮助您动态构建此类串联查询。

值得注意的是,如果你需要嵌套事务,那么你就不能再优化它了,因为嵌套事务的逻辑深深地依赖于被翻译成承诺的单个查询的逻辑,然后以这样的方式链接起来与 PostgreSQL 事务逻辑一致。如果您尝试解决这个问题,事情很可能会分崩离析,因为嵌套事务通常太复杂而无法手动处理。