支援的版本: 目前版本 (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 銷毀儲存點,而不捨棄在建立儲存點之後執行的命令的效果。

指定一個尚未建立的儲存點名稱會產生錯誤。

游標在儲存點方面具有某種程度的非交易行為。在儲存點內開啟的任何游標都會在回滾儲存點時關閉。如果先前開啟的游標受到儲存點內 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;

相容性

TheSQL標準規定關鍵字 SAVEPOINT 是強制性的,但 PostgreSQLOracle 允許省略它。SQL 僅允許 WORK,而不是 TRANSACTION,作為 ROLLBACK 後面的干擾詞。此外,SQL 還有一個可選子句 AND [ NO ] CHAINPostgreSQL 目前不支援該子句。否則,此命令符合 SQL 標準。

提交更正

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