node.js – 锁定postgres事务

我正在加载测试我的node.js应用程序.在某些时候,我到达请求待决的状态,我最好的猜测是因为锁定的事务.这是最后一个日志语句:

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

在pg_lock中,我有4行,上面的查询是GRANTED = true,模式是ExclusiveLock.

我应该从哪里开始寻找错误?
如果在这个锁定请求中我做了很多插入和更新操作,隔离级别应该是REPEATABLE READ吗?
有没有办法调试/处理这种情况?
是否存在任何超时锁定机制,以便可以轻松/自动释放应用程序而不阻止进一步的请求?

附带问题(因为我不是直接寻找工具):有没有工具来监控和发现这种情况? (我希望使用Munin.)

我使用nodejs 4.2.1 with express 4.13.3,sequelize 3.19.3 as Postgres 9.4.1 ORM.

最佳答案 欢迎来到PostgreSQL事务锁地狱:)

您可以花费大量时间来确定锁定发生的位置以及原因.但它很有可能帮助你解决问题.

解决这种情况的一般方法如下:

>将事务大小保持在应用程序业务逻辑所需的最低限度.例如,避免使用相同类型的插入或更新,将其替换为多行类似物,因为查询IO很昂贵
>在执行仅修改数据的单个查询时不要使用事务,即避免不必要的事务.
>实现可以确定事务锁定并提供执行事务的重复尝试的错误处理.记录此类重复将帮助您了解系统的弱点以及如何更好地重新设计它.

即使在精心设计的系统中,最后一步也常常成为必需品,不要让它吓到你;)

点赞