Skip to content
PostgresSQL 超时(Timeout) 详解

PostgresSQL 超时(Timeout) 详解

PostgreSQL 提供了多种超时设置,帮助控制数据库操作的时长,优化系统性能和稳定性,特别是在高并发或复杂查询环境中。以下是几种常见的超时设置及其用途。

PostgreSQL

语句超时

官网说明: (opens in a new tab)

Statement timeout

statement_timeout 设置单个查询的最大执行时间,如果查询超出这个时间限制,PostgreSQL 将自动取消查询并返回错误:

ERROR:  canceling statement due to statement timeout

如果查询包含多个 SQL 语句,则超时将分别应用于每个语句。此设置有助于防止长时间运行的查询消耗过多资源,并确保数据库高效运行。

事务超时

官网说明: (opens in a new tab)

Image description

PostgreSQL 17 引入了新的 transaction_timeout 设置,用于限制事务的最大持续时间,适用于显式事务(以 BEGIN 开始)和隐式事务(由单个语句组成的事务)。该功能会自动终止超过设定时间的事务,无论事务中包含的语句有多短。

典型的 Web 服务通常由三个核心组件组成:

  • Web 服务器
  • 应用服务器
  • 数据库服务器

为了避免长时间的连接,通常在 Web 服务器和应用服务器上设置连接超时。但是当 Web 或应用服务器在数据库仍在处理事务时终止连接时,这实际上是对资源的浪费。在 PostgreSQL 引入 transaction_timeout 之前,没有有效的机制来阻止长时间运行的事务。即使同时设置了 statement_timeout 和 idle_in_transaction_session_timeout,如果事务包含短语句和间歇性等待,事务仍可能长时间保持活动状态。

你可能想知道为什么 PostgreSQL 这么晚才引入 transaction_timeout 这样的基本功能。幸运的是,它终于来了!顺便说一句,MySQL 还没有类似的功能。

锁超时

官网说明: (opens in a new tab)

Image description

lock_timeout 控制事务等待数据库对象(如表或行)锁的最大时间。超时后,PostgreSQL 取消事务并返回错误:

ERROR:  canceling statement due to lock timeout

在 Postgres 中,等待获取锁的事务可能会阻塞需要相同资源的其他事务。对于需要获取重量级锁的操作(如 DDL 语句),可以设置较短的 lock_timeout 以确保及时释放资源。例如:

-- Set the lock timeout for the user to 5 seconds
ALTER ROLE admin_user SET lock_timeout = 5000; 

空闲会话超时

官网说明: (opens in a new tab)

Image description

idle_session_timeout 适用于任何空闲会话,并控制会话在终止之前可以空闲的最大时间。如果会话在指定的时间内未执行任何操作,PostgreSQL 将终止连接:

ERROR:  terminating connection due to idle session timeout

使用连接池或其他中间件时,请务必注意此设置可能会导致连接意外终止。此设置通常用于交互式会话,建议为此类用户设置合理的超时值,例如:

-- Set idle session timeout to 10 minutes
ALTER ROLE admin_user SET idle_session_timeout = 600000;

-- Set idle session timeout to 10 minutes
ALTER ROLE admin_user SET idle_session_timeout = '10min'; 

事务空闲会话超时

官网说明: (opens in a new tab)

Image description

idle_in_transaction_session_timeout 控制事务可以保持空闲状态的最大时间。超时后,PostgreSQL 会自动终止会话并回滚任何未完成的事务:

ERROR:  terminating connection due to idle-in-transaction timeout

假设您有一个应用程序,它在等待用户输入或执行一些与数据库无关的处理时偶尔会打开事务。如果事务打开并空闲的时间过长,它可能会锁定表或行,从而阻止其他事务访问这些资源。

此设置适用于在等待用户输入或处理非数据库任务时可能保持事务打开的应用程序。长时间保持空闲事务打开可能会阻止其他事务或导致表膨胀,因此通过设置此超时,您可以防止资源被不必要地占用。

Reference

开始体验 Chat2DB Pro

如果你正在寻找一款强大、基于 AI 的数据库管理工具,快来试试 Chat2DB 吧!无论你是数据库管理员、开发者还是数据分析师,Chat2DB 都能通过 AI 的强大功能简化你的工作。

👉现在享受 Chat2DB Pro 30 天免费试用 (opens in a new tab),即刻体验所有高级功能。