用户断开连接后 PostgreSQL 咨询锁仍然存在

Posted

技术标签:

【中文标题】用户断开连接后 PostgreSQL 咨询锁仍然存在【英文标题】:PostgreSQL advisory lock stays after user disconnect 【发布时间】:2016-12-07 13:26:51 【问题描述】:

我有一个实现会话级咨询锁定的后端应用程序。但是,如果客户端突然失去连接(例如在连接时强制重新启动),咨询锁将保持在那里并且不会消失。

有没有办法让锁在连接断开后总是过期?

谢谢。

【问题讨论】:

While a flag stored in a table could be used for the same purpose, advisory locks are faster, avoid table bloat, and are automatically cleaned up by the server at the end of the session. postgresql.org/docs/9.1/static/explicit-locking.html 所以只要你的连接超时就可以了。 【参考方案1】:

我假设锁仍然存在,因为后端进程仍然存在。

除非服务器尝试联系客户端,否则操作系统可能需要很长时间才能检测到客户端套接字不再存在,此时 PostgreSQL 后端将被终止。

您可以将 PostgreSQL 参数 tcp_keepalives_idle 设置为较小的值,以减少检测到死连接的时间。

【讨论】:

以上是关于用户断开连接后 PostgreSQL 咨询锁仍然存在的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 咨询锁不适用于 Doctrine 的 DBAL

用户的套接字与服务器断开连接后如何发送消息

远程桌面连接断开后服务器自动锁屏

Socket.io 会话管理?

数据库刷新后用户会话仍然有效

pgbench 进行大量事务后数据库暂时断开连接