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

ROLLBACK TO SAVEPOINT

ROLLBACK TO SAVEPOINT — 回滾到儲存點

概要

ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] savepoint_name

描述

回滾所有在建立儲存點之後執行的命令,然後在新子事務的相同事務級別上啟動。該儲存點仍然有效,如果需要,可以稍後再次回滾到它。

ROLLBACK TO SAVEPOINT 會隱式銷燬在命名的儲存點之後建立的所有儲存點。

引數

savepoint_name

要回滾到的儲存點。

註釋

使用 RELEASE SAVEPOINT 來銷燬一個儲存點,而不丟棄它建立之後執行的命令的效果。

指定一個未建立的儲存點名稱是一個錯誤。

游標(Cursors)在儲存點方面具有某種非事務性的行為。在儲存點內開啟的任何游標將在儲存點被回滾時關閉。如果一個先前已開啟的游標受到在之後被回滾的儲存點內的 FETCHMOVE 命令的影響,游標將停留在 FETCH 命令使其指向的位置(即,由 FETCH 引起的游標移動不會被回滾)。關閉游標也不會被回滾。然而,由游標查詢引起的其他副作用(例如,由查詢呼叫的易變函式產生的副作用)如果在之後被回滾的儲存點期間發生,則 被回滾。導致事務中止的游標將被置於無法執行狀態,因此雖然可以使用 ROLLBACK TO SAVEPOINT 恢復事務,但該游標將無法再使用。

示例

撤銷在建立 my_savepoint 之後執行的命令的效果

ROLLBACK TO SAVEPOINT my_savepoint;

游標位置不受儲存點回滾的影響

BEGIN;

DECLARE foo CURSOR FOR SELECT 1 UNION SELECT 2;

SAVEPOINT foo;

FETCH 1 FROM foo;
 ?column?
----------
        1

ROLLBACK TO SAVEPOINT foo;

FETCH 1 FROM foo;
 ?column?
----------
        2

COMMIT;

相容性

SQL標準規定關鍵字 SAVEPOINT 是強制性的,但 PostgreSQLOracle 允許省略它。SQL 僅允許 WORK,而不允許 TRANSACTION,作為 ROLLBACK 之後的噪聲詞。此外,SQL 有一個可選的子句 AND [ NO ] CHAIN,目前 PostgreSQL 不支援。除此之外,該命令符合 SQL 標準。

提交更正

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