支援的版本:目前 (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 標準。

提交更正

如果您在文件中發現任何不正確、與您特定功能的使用經驗不符或需要進一步澄清的地方,請使用此表格來回報文件問題。