gpt4 book ai didi

node.js - 什么可能导致 "idle in transaction"语句出现 "BEGIN"

转载 作者:行者123 更新时间:2023-12-02 21:26:07 28 4
gpt4 key购买 nike

我们有一个通过 pg-promise 连接到 Postgres 11 服务器的 Node.js 应用程序 - 所有进程都在 Docker 容器中的单个云服务器上运行。
有时我们会遇到应用程序不再使用react的情况。

上次发生这种情况时,我花了一点时间通过 pgadmin 检查数据库,它显示连接是 idle in transaction与声明BEGIN以及virtualxid的独占锁
enter image description here enter image description here

我认为情况是这样的:

  1. 应用程序已通过发送 BEGIN 启动交易sql命令到数据库
  2. 数据库收到此命令并启动一个新事务,从而获得模式 virtualxid 的独占锁
  3. 现在数据库等待应用程序发送下一条语句(直到收到 COMMITROLLBACK ) - 然后它将 Release模式 virtualxid 的独占锁
  4. 但由于某种原因,它不再得到语句:
    我认为 node.js 事件循环被阻止 - 因为当时,当我们看到这些锁时,node.js 应用程序不再记录语句。但网络服务器仍然收到请求并报告一些upstream timed out请求。

这有意义吗(我真的不确定 2. 和 3.)?
为什么所有交易一开始都会被阻塞?这只是巧合还是显示的 SQL 可能是错误的?

顺便说一句:在此answer我发现,我们可以设置idle_in_transaction_session_timeout这样这些事务将在超时后被释放 - 这很好,但我尝试了解导致此问题的原因。

最佳答案

事务根本没有阻塞。数据库正在等待应用程序发送下一条语句。

事务 ID 上的锁只是事务相互阻塞的一种技术,即使它们没有争用表锁(例如,如果它们正在等待行锁):每个事务都持有一个排他锁它自己的事务 ID,如果它必须等待并发事务完成,它可以只请求对该事务 ID 的锁定(并被阻止)。

如果所有事务都像这样,那么锁一定位于应用程序中的某个位置;不涉及数据库。

在数据库中查找阻塞的进程时,请在 pg_locks 中查找 granted 为 false 的行。

关于node.js - 什么可能导致 "idle in transaction"语句出现 "BEGIN",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59162112/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com