# 40000 — transaction_rollback（事务回滚）

> PostgreSQL SQLSTATE 40000 的来源与机制边界参考。
---

# 40000 — transaction_rollback（事务回滚）

## 速览 {#at-a-glance}

`40000` 是事务回滚的总括条件。18.6 固定源码包含 `transaction aborted during system catalog scan` 的内部系统目录扫描路径；复现它需要安全 SQL 案例之外的内部故障或可见性条件。不要把序列化失败、死锁或任意客户端取消改称 40000。

<!-- BEGIN SQLSTATE FACTS: generated by scripts/generate.py; do not edit -->

| 字段 | 值 |
| --- | --- |
| SQLSTATE | `40000` |
| 条件名 | `transaction_rollback` |
| 状态 | `有效` |
| 已知存在于 | `7.4` |
| 锁定快照 | `9.0.23, 9.1.24, 9.2.24, 9.3.25, 9.4.26, 9.5.25, 9.6.24, 10.23, 11.22, 12.22, 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3` |
| 宏 | `ERRCODE_TRANSACTION_ROLLBACK` |
| 别名 | `—` |

<!-- source facts: data/errcodes/40000.json -->
<!-- END SQLSTATE FACTS -->

## 含义 {#meaning}

`40000` 是宽泛的事务回滚条件。`genam.c` 中解析到的核心路径是防御性内部错误：系统目录扫描期间事务已中止。它不是 `40001` 表示的常规客户端重试路径，也不是死锁报告。

## 诊断 {#diagnosis}

若真实出现 `40000`，保存服务器日志、后端 PID、操作和源码诊断；固定主模板是 `transaction aborted during system catalog scan`。检查日志是否指向内部目录/索引可见性问题或服务器故障。客户端 `ROLLBACK`、序列化失败或语句取消都不能证明该码，选定扫描也没有安全的纯 SQL 复现。

## 处理 {#response}

按服务器要求结束失败事务，并在重试前调查目录/索引和服务器健康状态。只有会话不可用时才重连，重做写入前先核对持久化结果。不要把 `40001`、`40P01` 或普通回滚改称 `40000`；本页只记录内部源码边界。

## 版本 {#versions}

上面的锁定事实表记录项目快照范围内的目录存在情况。固定源码证据只覆盖下面声明的路径；不能仅从定义推导精确行为引入版本或更广的运行覆盖。

## 相关 {#related}

可对照有明确机制的[40001 序列化失败](../40001/)和[40P01 检测到死锁](../40p01/)。

## 来源 {#sources}

- [`src.errcodes.18.6`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/errcodes.txt)（SHA-256 `6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba`）
- [`源码路径`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/access/index/genam.c#L496-L498)（SHA-256 `11897b1d8b1ae1f4a1bef9a72e740da7aa83579abf84e4ca5ebacd6530874c28`）
