RELEASE SAVEPOINT — 釋放先前定義的儲存點
RELEASE [ SAVEPOINT ] savepoint_name
RELEASE SAVEPOINT
釋放指定的儲存點以及所有在指定儲存點之後建立的活動儲存點,並釋放它們的資源。 自建立儲存點以來的所有變更(尚未回滾的變更)都會合併到建立指定儲存點時處於活動狀態的事務或儲存點中。 在 RELEASE SAVEPOINT
之後進行的變更也將成為此活動事務或儲存點的一部分。
savepoint_name
要釋放的儲存點的名稱。
指定先前未定義的儲存點名稱是錯誤的。
當事務處於中止狀態時,無法釋放儲存點;為此,請使用 ROLLBACK TO SAVEPOINT。
如果多個儲存點具有相同的名稱,則只釋放最近定義的未釋放儲存點。 重複的指令將逐步釋放較舊的儲存點。
建立並稍後釋放儲存點
BEGIN; INSERT INTO table1 VALUES (3); SAVEPOINT my_savepoint; INSERT INTO table1 VALUES (4); RELEASE SAVEPOINT my_savepoint; COMMIT;
上述交易將同時插入 3 和 4。
一個更複雜的範例,具有多個巢狀子交易
BEGIN; INSERT INTO table1 VALUES (1); SAVEPOINT sp1; INSERT INTO table1 VALUES (2); SAVEPOINT sp2; INSERT INTO table1 VALUES (3); RELEASE SAVEPOINT sp2; INSERT INTO table1 VALUES (4))); -- generates an error
在此範例中,應用程式請求釋放儲存點 sp2
,該儲存點插入了 3。 這會將插入的交易上下文變更為 sp1
。 當嘗試插入值 4 的語句產生錯誤時,2 和 4 的插入會遺失,因為它們位於相同的、現在已回滾的儲存點中,並且值 3 位於相同的交易上下文中。 應用程式現在只能選擇這兩個指令之一,因為所有其他指令都將被忽略
ROLLBACK; ROLLBACK TO SAVEPOINT sp1;
選擇 ROLLBACK
將中止所有內容,包括值 1,而 ROLLBACK TO SAVEPOINT sp1
將保留值 1 並允許事務繼續。
此指令符合SQL標準。 該標準指定關鍵字 SAVEPOINT
是強制性的,但 PostgreSQL 允許省略它。
如果您在文件中發現任何不正確、與特定功能的經驗不符或需要進一步澄清的地方,請使用此表單回報文件問題。