ROLLBACK TO SAVEPOINT — 回滾到儲存點
ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] savepoint_name
回滾所有在建立儲存點之後執行的命令,然後在新子事務的相同事務級別上啟動。該儲存點仍然有效,如果需要,可以稍後再次回滾到它。
ROLLBACK TO SAVEPOINT 會隱式銷燬在命名的儲存點之後建立的所有儲存點。
savepoint_name要回滾到的儲存點。
使用 RELEASE SAVEPOINT 來銷燬一個儲存點,而不丟棄它建立之後執行的命令的效果。
指定一個未建立的儲存點名稱是一個錯誤。
游標(Cursors)在儲存點方面具有某種非事務性的行為。在儲存點內開啟的任何游標將在儲存點被回滾時關閉。如果一個先前已開啟的游標受到在之後被回滾的儲存點內的 FETCH 或 MOVE 命令的影響,游標將停留在 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 是強制性的,但 PostgreSQL 和 Oracle 允許省略它。SQL 僅允許 WORK,而不允許 TRANSACTION,作為 ROLLBACK 之後的噪聲詞。此外,SQL 有一個可選的子句 AND [ NO ] CHAIN,目前 PostgreSQL 不支援。除此之外,該命令符合 SQL 標準。
如果您在文件中發現任何不正確、與您的實際體驗不符或需要進一步說明的內容,請使用 此表格 報告文件問題。