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

RELEASE SAVEPOINT

RELEASE SAVEPOINT — 釋放先前定義的儲存點

概要

RELEASE [ SAVEPOINT ] savepoint_name

描述

RELEASE SAVEPOINT 釋放指定的儲存點以及所有在指定儲存點之後建立的活動儲存點,並釋放它們的資源。 自建立儲存點以來的所有變更(尚未回滾的變更)都會合併到建立指定儲存點時處於活動狀態的事務或儲存點中。 在 RELEASE SAVEPOINT 之後進行的變更也將成為此活動事務或儲存點的一部分。

參數

savepoint_name

要釋放的儲存點的名稱。

備註

指定先前未定義的儲存點名稱是錯誤的。

當事務處於中止狀態時,無法釋放儲存點;為此,請使用 ROLLBACK TO SAVEPOINT

如果多個儲存點具有相同的名稱,則只釋放最近定義的未釋放儲存點。 重複的指令將逐步釋放較舊的儲存點。

範例

建立並稍後釋放儲存點

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 sp1;
    INSERT INTO table1 VALUES (2);
    SAVEPOINT sp2;
    INSERT INTO table1 VALUES (3);
    RELEASE SAVEPOINT sp2;
    INSERT INTO table1 VALUES (4))); -- generates an error

在此範例中,應用程式請求釋放儲存點 sp2,該儲存點插入了 3。 這會將插入的交易上下文變更為 sp1。 當嘗試插入值 4 的語句產生錯誤時,2 和 4 的插入會遺失,因為它們位於相同的、現在已回滾的儲存點中,並且值 3 位於相同的交易上下文中。 應用程式現在只能選擇這兩個指令之一,因為所有其他指令都將被忽略

ROLLBACK;
ROLLBACK TO SAVEPOINT sp1;

選擇 ROLLBACK 將中止所有內容,包括值 1,而 ROLLBACK TO SAVEPOINT sp1 將保留值 1 並允許事務繼續。

相容性

此指令符合SQL標準。 該標準指定關鍵字 SAVEPOINT 是強制性的,但 PostgreSQL 允許省略它。

提交更正

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