我正在查看Postgres Docs并且它似乎没有提到行锁发生的事情是连接到超时或事务保持未闭合。这样安全吗?当来自Web服务器的线程获得行锁定然后超时时会发生什么?如果连接被破坏,锁定会被释放吗?如果不是怎么办?
我在文档中找到的唯一保证是statement_timeout,但我相信后者会影响Reads和Writes,这不是预期的效果。
statement_timeout(整数)
从命令到达服务器的时间开始,中止任何超过指定毫秒数的语句 来自客户。如果log_min_error_statement设置为ERROR或更低, 超时的声明也将被记录。值为零( 默认情况下将其关闭。
建议不要在postgresql.conf中设置statement_timeout,因为它会影响所有会话。
答案 0 :(得分:5)
当连接超时打开事务时,事务将回滚(中止)。这将释放所有行锁。
连接超时不是PostgreSQL自己做的事情,它是由操作系统TCP堆栈完成的。 TCP keepalive对此非常有用。
请注意,statement_timeout
会将事务标记为已中止,但不会将其回滚并释放其锁定。你仍然需要ROLLBACK
。 PostgreSQL中没有“事务超时”,也没有任何数据库服务器级别的连接超时。
如果您尝试限制行锁的持续时间,您可能希望监控pg_locks
和pg_stat_activity
。 waiting
的{{1}}列和pg_stat_activity
的{{1}}列特别感兴趣。见https://wiki.postgresql.org/wiki/Lock_Monitoring