ROLLBACK TO SAVEPOINT — 回滾到儲存點
ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] savepoint_name
回滾所有在儲存點建立之後執行的命令,然後在相同的交易層級啟動一個新的子交易。儲存點仍然有效,如果需要,稍後可以再次回滾到該儲存點。
ROLLBACK TO SAVEPOINT
會隱含地銷毀所有在指定儲存點之後建立的儲存點。
savepoint_name
要回滾到的儲存點。
使用 RELEASE SAVEPOINT
銷毀儲存點,而不捨棄在建立儲存點之後執行的命令的效果。
指定一個尚未建立的儲存點名稱會產生錯誤。
游標在儲存點方面具有某種程度的非交易行為。在儲存點內開啟的任何游標都會在回滾儲存點時關閉。如果先前開啟的游標受到儲存點內 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;
TheSQL標準規定關鍵字 SAVEPOINT
是強制性的,但 PostgreSQL 和 Oracle 允許省略它。SQL 僅允許 WORK
,而不是 TRANSACTION
,作為 ROLLBACK
後面的干擾詞。此外,SQL 還有一個可選子句 AND [ NO ] CHAIN
,PostgreSQL 目前不支援該子句。否則,此命令符合 SQL 標準。
如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步說明的內容,請使用此表格回報文件問題。