SAVEPOINT — 在當前事務中定義一個新的儲存點
SAVEPOINT savepoint_name
SAVEPOINT
在當前事務中建立一個新的儲存點。
儲存點是事務內部的一個特殊標記,它允許回滾自該儲存點建立以來執行的所有命令,並將事務狀態恢復到建立儲存點時的狀態。
savepoint_name
為新的儲存點指定的名稱。如果同名的儲存點已存在,則它們將不可訪問,直到同名的較新的儲存點被釋放。
使用 ROLLBACK TO
回滾到儲存點。使用 RELEASE SAVEPOINT
銷燬一個儲存點,保留自其建立以來執行的命令的效果。
儲存點只能在事務塊內建立。一個事務中可以定義多個儲存點。
建立一個儲存點,然後回滾自其建立以來執行的所有命令的效果
BEGIN; INSERT INTO table1 VALUES (1); SAVEPOINT my_savepoint; INSERT INTO table1 VALUES (2); ROLLBACK TO SAVEPOINT my_savepoint; INSERT INTO table1 VALUES (3); COMMIT;
上面的事務將插入值 1 和 3,但不會插入 2。
建立並稍後銷燬一個儲存點
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 my_savepoint; INSERT INTO table1 VALUES (2); SAVEPOINT my_savepoint; INSERT INTO table1 VALUES (3); -- rollback to the second savepoint ROLLBACK TO SAVEPOINT my_savepoint; SELECT * FROM table1; -- shows rows 1 and 2 -- release the second savepoint RELEASE SAVEPOINT my_savepoint; -- rollback to the first savepoint ROLLBACK TO SAVEPOINT my_savepoint; SELECT * FROM table1; -- shows only row 1 COMMIT;
上面的事務顯示行 3 先被回滾,然後是行 2。
SQL 要求,當建立另一個同名儲存點時,該儲存點必須自動銷燬。在 PostgreSQL 中,舊的儲存點會被保留,儘管在回滾或釋放時只會使用較新的那個。(使用 RELEASE SAVEPOINT
釋放較新的儲存點將導致舊的儲存點再次可用於 ROLLBACK TO SAVEPOINT
和 RELEASE SAVEPOINT
。)除此之外,SAVEPOINT
完全符合 SQL 標準。
如果您在文件中發現任何不正確、與您實際使用該功能時的體驗不符或需要進一步說明的內容,請使用 此表單 報告文件問題。