2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0

SAVEPOINT

SAVEPOINT — 在當前事務中定義一個新的儲存點

概要

SAVEPOINT savepoint_name

描述

SAVEPOINT 在當前事務中建立一個新的儲存點。

儲存點是事務內部的一個特殊標記,它允許回滾自該儲存點建立以來執行的所有命令,並將事務狀態恢復到建立儲存點時的狀態。

引數

savepoint_name

為新的儲存點指定的名稱。如果同名的儲存點已存在,則它們將不可訪問,直到同名的較新的儲存點被釋放。

註釋

使用 ROLLBACK TO 回滾到儲存點。使用 RELEASE SAVEPOINT 銷燬一個儲存點,保留自其建立以來執行的命令的效果。

儲存點只能在事務塊內建立。一個事務中可以定義多個儲存點。

示例

建立一個儲存點,然後回滾自其建立以來執行的所有命令的效果

BEGIN;
    INSERT INTO table1 VALUES (1);
    SAVEPOINT my_savepoint;
    INSERT INTO table1 VALUES (2);
    ROLLBACK TO SAVEPOINT my_savepoint;
    INSERT INTO table1 VALUES (3);
COMMIT;

上面的事務將插入值 1 和 3,但不會插入 2。

建立並稍後銷燬一個儲存點

BEGIN;
    INSERT INTO table1 VALUES (3);
    SAVEPOINT my_savepoint;
    INSERT INTO table1 VALUES (4);
    RELEASE SAVEPOINT my_savepoint;
COMMIT;

上面的事務將同時插入 3 和 4。

使用單個儲存點名稱

BEGIN;
    INSERT INTO table1 VALUES (1);
    SAVEPOINT my_savepoint;
    INSERT INTO table1 VALUES (2);
    SAVEPOINT my_savepoint;
    INSERT INTO table1 VALUES (3);

    -- rollback to the second savepoint
    ROLLBACK TO SAVEPOINT my_savepoint;
    SELECT * FROM table1;               -- shows rows 1 and 2

    -- release the second savepoint
    RELEASE SAVEPOINT my_savepoint;

    -- rollback to the first savepoint
    ROLLBACK TO SAVEPOINT my_savepoint;
    SELECT * FROM table1;               -- shows only row 1
COMMIT;

上面的事務顯示行 3 先被回滾,然後是行 2。

相容性

SQL 要求,當建立另一個同名儲存點時,該儲存點必須自動銷燬。在 PostgreSQL 中,舊的儲存點會被保留,儘管在回滾或釋放時只會使用較新的那個。(使用 RELEASE SAVEPOINT 釋放較新的儲存點將導致舊的儲存點再次可用於 ROLLBACK TO SAVEPOINTRELEASE SAVEPOINT。)除此之外,SAVEPOINT 完全符合 SQL 標準。

提交更正

如果您在文件中發現任何不正確、與您實際使用該功能時的體驗不符或需要進一步說明的內容,請使用 此表單 報告文件問題。