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