【发布时间】:2017-11-20 15:14:44
【问题描述】:
我正在对我的 node.js 应用程序进行负载测试。在某些时候,我达到了请求待处理的状态,我最好的猜测是由于锁定的事务。这是最后一条日志语句:
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
在pg_lock 中,我有 4 行上面的查询分别是 GRANTED = true 和 mode ExclusiveLock。
我应该从哪里开始寻找错误?
如果在这个锁定请求中我提出了很多insert 和update 操作,那么隔离级别应该是REPEATABLE READ 吗?
有没有办法调试/处理这种情况?
是否有任何超时锁定机制,以便应用可以轻松/自动释放并且不会阻止进一步的请求?
附带问题(因为我没有直接寻找工具):是否有任何工具可以监控和发现这种情况? (我希望使用 Munin。)
我正在使用 nodejs 4.2.1 和 express 4.13.3,将 3.19.3 续集为 Postgres 9.4.1 ORM。
【问题讨论】:
-
你检查 pg_stat_activity 和 pg_locks 了吗?你看到什么样的锁?那么 postgres 日志文件呢?你看到死锁了吗?
-
@FrankHeikens,我已经检查过
pg_stat_activity并没有发现任何可疑之处,但也许我不知道如何正确检查。当谈到锁定类型和查看日志文件时,我已经在我的问题中提到了它。GRANTED = true是否意味着没有死锁?如何正确验证? -
@FrankHeikens 关于 cmets,我还可以找到:
ERROR: could not serialize access due to concurrent update,这是我以前没见过的。当我在应用程序卡住时将其杀死时,日志中会出现LOG: unexpected EOF on client connection with an open transaction多次。 -
如果没有代码和要求,很难判断问题出在哪里,但这是一个已知问题:postgresql.org/docs/9.4/static/… 根本原因:可重复读取事务在可重复读取事务之后无法修改或锁定其他事务更改的行开始了。
-
@kasiacode,你最终找到解决方法了吗?我遇到了类似的问题,目前处于死胡同。
标签: node.js postgresql sequelize.js