# 3B000 — savepoint_exception（保存点异常）

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

# 3B000 — savepoint_exception（保存点异常）

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

`3B000` 是保存点异常类别的定义。固定核心调用扫描解析到的是更具体的缺失保存点路径 `3B001`，没有独立的通用 `3B000` 抛出点。诊断保存点失败时应使用服务器实际给出的具体 SQLSTATE；本页不编造类别级 RAISE 案例。

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

| 字段 | 值 |
| --- | --- |
| SQLSTATE | `3B000` |
| 条件名 | `savepoint_exception` |
| 状态 | `有效` |
| 已知存在于 | `8.0.0` |
| 锁定快照 | `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_SAVEPOINT_EXCEPTION` |
| 别名 | `—` |

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

## 含义 {#meaning}

`3B000` 是 3B 类的保存点异常条件。固定扫描解析到具体的缺失保存点码 `3B001`，没有独立的通用类码核心抛出点。因此服务器给出具体码时，应按 `3B001` 诊断找不到的保存点名称。

## 诊断 {#diagnosis}

保存请求的保存点名称、是否存在显式事务，以及标记是否已释放或属于另一层嵌套。先读取服务器给出的具体 SQLSTATE：没有事务块时 `ROLLBACK TO SAVEPOINT` 是 `25P01`；显式块中缺少标记，在选定源码中由 `3B001` 表示。本页没有独立的自然运行案例。

## 处理 {#response}

按具体错误选择边界：先开启事务再创建保存点；显式事务失败后先回滚，再建立新标记。不要伪造 `3B000` 的重试或使用 `CASCADE`；本页保持定义边界，缺失名称请看有源码依据的 [3B001](../3b001/) 路径。

## 版本 {#versions}

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

## 相关 {#related}

具体的缺失保存点路径见[3B001 保存点说明无效](../3b001/)。

## 来源 {#sources}

- [`src.errcodes.18.6`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/errcodes.txt)（SHA-256 `6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba`）
- 固定调用扫描 `src.calls.REL_18_6`（SHA-256 `9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf`）
