【发布时间】:2020-03-28 10:26:19
【问题描述】:
我们有一个 node.js 应用程序,它通过 pg-promise 连接到 Postgres 11 服务器 - 所有进程都在 docker 容器中的单个云服务器上运行。
有时我们会遇到应用程序不再响应的情况。
上次发生这种情况时,我有一点时间通过 pgadmin 检查数据库,它显示连接是idle in transaction,声明为BEGIN,排他锁为virtualxid
我认为情况是这样的:
- 应用程序已通过向数据库发送
BEGINsql 命令启动事务 - db 得到这个命令并开始了一个新事务,因此获得了模式
virtualxid的排他锁 - 现在db等待应用程序发送下一条语句(直到它收到
COMMIT或ROLLBACK)-然后它将释放模式virtualxid的排他锁 - 但由于某种原因,它不再得到语句:
我认为 node.js 事件循环被阻塞了——因为当时,当我们看到这些锁时,node.js 应用程序不再记录语句。但是网络服务器仍然收到请求并报告了一些upstream timed out请求。
这有意义吗(我真的不确定 2. 和 3.)?
为什么一开始所有交易都会阻塞?这只是巧合还是显示的 SQL 可能有误?
顺便说一句:在answer 中我发现,我们可以设置idle_in_transaction_session_timeout 以便在超时后释放这些事务 - 这很好,但我试图了解导致此问题的原因。
【问题讨论】:
-
您没有在应用程序的某处执行松散的
BEGIN,是吗?如果它都是pg-promise库的方法tx的一部分,那么应该遵循以下查询。也许您的事务逻辑由于某些原因未能执行与事务相关的查询?
标签: node.js postgresql pg-promise