我正在使用知道在我的应用程序中连接postgres。我运行
时遇到以下错误knex migrate:latest
TimeoutError: Knex: Timeout acquiring a connection. The pool is probably full. Are you missing a .transacting(trx) call?
at Timeout._onTimeout
引用一些线程,我知道我必须添加交易调用但是我是否需要添加我的应用程序的所有sql调用?
在documentation中,它没有详细说明何时添加此内容?为什么必须?我的查询大多是“GET”类型,因此不确定这些查询是否需要应用交易?
答案 0 :(得分:2)
这似乎是一个库bug。
一般来说,包括SELECT在内的任何行为都需要具有读锁定的事务。 DB将根据事务隔离级别设置组织资源锁定序列,并且大多数READ COMMITTED
是默认值。用户正在读取表中的行,直到完成操作为止。删除(独占锁定)等待,直到Select(读取共享锁)释放它,即使我们没有提到开始事务。
因此,大多数数据库连接库都支持“自动提交”选项,如this,this和this,如果没有,则默认自动换行显式事务(或本地支持DBMS会话选项),因此所有请求都在事务块上运行。
Knex似乎没有明确地使用此选项。我可以找到 它可能与DBMS类型不同。 Oracle dialect。在阅读代码时,我发现Oracle实现有here但Postgresql实现here没有自动提交。它看起来不完整。
该文件还说它可以在不进行交易的情况下选择查询。如果它泄漏了许多开放会话,那么它显然是一个错误。请提交带有示例代码的错误报告以重现此问题。
或者您可以从数据库端检查待处理列表中的哪些查询。所有现代数据库系统都可以列出会话和锁定状态。我想你已经混合了天真的select调用和transacting()调用,然后天真的select调用可能会附加到一个未提交的打开事务。您可以通过this等数据库管理功能查看正在发生的情况。