PostgreSQL中idle_in_transaction_session_timeout对COMMIT/ROLLBACK不生效的解决办法
PostgreSQL 闲置会话超时问题解答
为什么COMMIT/ROLLBACK后的会话不受idle_in_transaction_session_timeout限制?
idle_in_transaction_session_timeout仅作用于处于事务中且闲置的会话。当执行COMMIT或ROLLBACK后,事务正式结束,会话会从「事务内闲置」状态切换为普通的「空闲(idle)」状态,此时该参数不再对其生效。- 你看到的闲置超过35分钟的会话,本质是完成事务提交/回滚后的普通空闲会话,并非事务中的闲置状态,所以不会被这个参数终止。
实现所有闲置会话10分钟内终止的方案
要覆盖所有类型的闲置会话,需要配合使用另一个参数:
- 启用
idle_session_timeout:该参数针对所有处于idle状态的会话(无论是否曾处于事务中),超时后会自动断开连接。设置为10分钟(600000毫秒)即可:- 临时生效(仅当前会话):
SET idle_session_timeout = 600000; - 全局永久生效(修改
postgresql.conf后,需重载或重启数据库):idle_session_timeout = 600000 # 单位毫秒,对应10分钟
- 临时生效(仅当前会话):
- 搭配原参数使用:
idle_in_transaction_session_timeout负责管控事务内的闲置超时,idle_session_timeout负责事务结束后的普通空闲超时,两者结合即可覆盖所有闲置场景。 - 验证设置有效性:可通过系统视图确认参数配置:
SELECT name, setting FROM pg_settings WHERE name IN ('idle_in_transaction_session_timeout', 'idle_session_timeout');
内容的提问来源于stack exchange,提问作者Fahmi Roihan
相关产品推荐
相关产品推荐

