选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

百科 / 错误代码 / Class 57 操作员干预

57014 query_canceled

查询已取消

ERROR 已实测 详解 实测通过

类别
Class 57 操作员干预
严重等级
ERROR
条件名
query_canceled
宏名称
ERRCODE_QUERY_CANCELED
启用版本
7.4
状态
活跃

版本覆盖

速览

57014 是 PostgreSQL 类别 57 operator_intervention 中的 query_canceled 条件。它表示服务器中断了某条语句。多个取消来源共用这个 SQLSTATE,因此必须结合主报文和服务器上下文,区分 statement timeout、客户端取消、恢复冲突或其他管理路径。

代表性案例在专用自动提交连接上设置 statement_timeout 为 100 ms,再执行 pg_sleep(1)。PostgreSQL 返回 canceling statement due to statement timeout;连接保持 IDLE,后续 SELECT 1 返回 1。这只证明本案例的超时路径及连接可用性,不能推断所有取消命令都没有副作用或拥有相同事务状态。

运行 57014-registry-final-20260909 在 PostgreSQL 18.6 和隔离的 PostgreSQL 10.21 上均通过。逐目标断言和结构化观察见公开证据 JSON

含义与触发路径

statement_timeout 为每条语句启动计时器,预算到期后请求 backend 处理中断。在固定源码路径中,ProcessInterrupts 使用 ERRCODE_QUERY_CANCELEDcanceling statement due to statement timeout 报告错误。客户端取消使用相同 SQLSTATE 但主报文是 canceling statement due to user request;锁超时和某些恢复路径使用自己的报文或 detail。

取消会在可处理中断的点停止当前语句。它不等于所有关联请求的工作都已经停止,也不保证外部副作用已经撤销,更不保证无需回滚就能继续使用事务。必须结合事务边界、语句类型和取消来源确定清理方式。

报文与诊断

代表性操作是在专用自动提交连接上设置 100 ms 超时:

SET statement_timeout = '100ms';
SELECT pg_sleep(1);
SELECT 1;

PostgreSQL 18.6 返回:

SQLSTATE: 57014
severity: ERROR
message_primary: canceling statement due to statement timeout
source: postgres.c / ProcessInterrupts / line 3446

PG10 返回相同的主报文,对应源码行号为 3018。57014 没有统一的 detail 模板;如果客户端提供,应保存 message_detail、message_hint、上下文及被中断的语句。

报文模板

源码里的格式串,不是某一次运行的输出。%s 之类是占位符,实际报文会填入对象名与取值。适用范围一栏是核验时留下的原始英文记录,未经翻译。

主消息 canceling statement due to statement timeout

来源:src/backend/tcop/postgres.c(lines 3441-3446) @ REL_18_6

适用范围:This template identifies the statement_timeout path; other query-canceled paths have their own messages.

诊断

记录 SQLSTATE、严重级别、主报文、detail、hint、上下文、backend PID、语句文本、超时设置和取消来源。区分 statement timeout、lock timeout、客户端取消、管理员请求以及备用机恢复冲突。客户端诊断不完整时,可使用 SQLSTATE 和 backend PID 检查服务器日志。

检查错误后的事务状态。本案例的自动提交超时后为 IDLE,并成功执行 SELECT 1;显式事务中的错误可能让事务进入 INERROR,需要回滚。如果语句在出错前已改变行,应检查数据库实际状态,不要假定数据库之外的整个请求都能自动回滚。

处理与修复

根据原因调整操作和预算:

  • 优化或拆分过长查询,设置符合服务预算的超时。
  • 将客户端或管理员取消视为控制决策,再判断应用是否应重试。
  • 如果报文指向 lock timeout,应独立解决锁竞争;提高 statement timeout 不会修复锁队列。
  • 显式事务中止后先回滚,再发送无关命令;对生命周期不受 PostgreSQL 控制的外部工作进行验证。

代表性后续查询返回 1,连接状态为 IDLE。这是自动提交 sleep 案例的修复断言,不保证被取消的写入、游标或事务都能原地继续。

可复现案例

在一次性实例上执行过的场景。其中 1 个附有可执行 SQL,正文相应小节里给出。

statement_timeout_cancel PG 10 / 18 有 SQL

前置条件

  • A dedicated connection
  • statement_timeout set to 100 ms

触发

Run pg_sleep(1) and let the server cancel the statement at the configured timeout.

断言

  • SQLSTATE is 57014
  • The message identifies statement timeout
  • The autocommit connection is usable for a subsequent query

处置

Classify timeout by operation and budget; tune the timeout or query, and do not treat cancellation as proof that all server work has stopped without checking the operation.

清理

Drop the case schema with an owner connection.

版本与边界

目录在 PostgreSQL 7.4 的锁定定义中已观察到 57014,并持续到 8.4.22 的 pre-9.0 定义;随后在列出的所有正式快照直到 PostgreSQL 18.6 以及 PostgreSQL 19 Beta 3 预览中存在。这是 definition_only 的存在边界,不是确切实现引入版本或运行时使用断言。扫描范围内没有记录该条件的定义变化。

statement timeout 案例在 PostgreSQL 18.6 和 10.21 上均通过。该 SQLSTATE 还用于其他取消机制,而它们的报文和事务影响不同;本证据范围限定为自动提交连接上的服务器 statement timeout。

来源

证据

断言

每条断言都写明了是怎么核实的,以及它不覆盖什么。这一层是核验时留下的原始英文记录,照原样呈现,未经翻译。

运行记录

目标服务器版本结果覆盖案例
latest 18.6 (Homebrew) passed statement_timeout_cancel
pg10 10.21 (Debian 10.21-1.pgdg90+1) passed statement_timeout_cancel

同类错误代码

Class 57 操作员干预 下的其他成员。