【问题标题】:pg-promise: when are BEGIN and COMMIT sent?pg-promise:BEGIN 和 COMMIT 什么时候发送?
【发布时间】:2019-03-30 17:29:11
【问题描述】:

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

在 pg-promise 中,使用事务时何时/如何发送 BEGIN 和 COMMIT 命令?

例如,如果有代码:

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

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

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

【问题讨论】:

    标签: pg-promise


    【解决方案1】:

    我是图书馆的作者。

    BEGIN 命令是与第一个查询一起发送还是在之前的一个单独的数据包中发送?

    之前。

    COMMIT 命令会与第二个查询一起发送还是之后发送?

    之后。

    此交易需要 2、3 或 4 次往返吗?

    4

    您是说有优化空间,还是说使用较低级别的库可能是有益的(对于延迟)?

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

    唯一需要优化的情况是,如果您需要执行大量的微事务,否则从性能方面来说不值得这样做。

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

    值得注意的是,如果您需要嵌套事务,那么您将无法再对其进行优化,因为嵌套事务的逻辑深深依赖于单个查询的逻辑,这些查询被转换为承诺,然后以与PostgreSQL 事务逻辑。如果你试图解决这个问题,事情很可能会崩溃,因为嵌套事务通常太复杂而无法手动处理。

    【讨论】:

    • 您是说这个库还有优化的空间,还是说使用较低级别的库可能是有益的(对于延迟)?
    猜你喜欢
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 2015-08-09
    • 2011-12-17
    • 2010-11-18
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    相关资源
    最近更新 更多