【发布时间】:2020-09-27 04:04:57
【问题描述】:
来自 pg-promise 常见问题解答Why use method batch instead of promise.all?:
在释放连接之前解决在您的任务或事务中创建的所有承诺查询是典型的
我不明白为什么这会是个问题。
对于示例,当我们有一个这样的查询数组时:
[
t.any("SELECT pg_sleep(2) as a"),
t.any('this will fail'),
t.any("SELECT pg_sleep(3) as b")
]
注意:pg_sleep 仅用于测试。
在生产中,这将是 Insert/Update/Delete 语句。而且我们只想在所有事务都成功后提交事务:即当其中任何一个失败时返回错误。
当我们使用 batch() 时:
- 第一个承诺将在 2 秒后解决
- 第二个承诺将拒绝
- 第三个查询仍将发送到数据库并在 3 秒后返回
- 终于(总共 5 秒后)
batch完成,我们可以向调用者返回错误。
当我们使用 Promise.all() 时:
- 第一个承诺将在 2 秒后解决
- 第二个承诺将拒绝 - 这将回滚事务并释放数据库连接
- 现在我们已经可以向调用者返回错误了
- 第三个请求将立即失败并返回
Querying against a released or lost connection.。这无论如何都是意料之中的,所以我们可以忽略它。
所以我会说Promise.all 更好,因为:
- 第一个错误后立即返回
- 甚至不会将第三个无用查询发送到数据库
我错过了什么?
这是否可能会导致其他问题:例如将断开的连接返回到池等。
【问题讨论】:
标签: pg-promise