FirebirdSQL logo

SAVEPOINT

Назначение

Создание точки сохранения.

Доступно в

DSQL

Синтаксис
SAVEPOINT sp_name
Table 1. Параметры оператора SAVEPOINT
Параметр Описание

sp_name

Имя точки сохранения.Должно быть уникальным в рамках транзакции.

Оператор SAVEPOINT создаёт SQL:99 совместимую точку сохранения, к которой можно позже откатывать работу с базой данных, не отменяя все действия, выполненные с момента старта транзакции.Механизмы точки сохранения также известны под термином “вложенные транзакции” (“nested transactions”).

Если имя точки сохранения уже существует в рамках транзакции, то существующая точка сохранения будет удалена, и создаётся новая с тем же именем.

Для отката изменений к точке сохранения используется оператор ROLLBACK TO SAVEPOINT.

Note

Внутренний механизм точек сохранения может использовать большие объёмы памяти, особенно если вы обновляете одни и те же записи многократно в одной транзакции.Если точка сохранения уже не нужна, но вы ещё не готовы закончить транзакцию, то можно её удалить оператором RELEASE SAVEPOINT, тем самым освобождая ресурсы.

Example 1. DSQL сессия с использованием точек сохранения
CREATE TABLE TEST (ID INTEGER);
COMMIT;
INSERT INTO TEST VALUES (1);
COMMIT;
INSERT INTO TEST VALUES (2);
SAVEPOINT Y;
DELETE FROM TEST;
SELECT * FROM TEST; -- возвращает пустую строку
ROLLBACK TO Y;
SELECT * FROM TEST; -- возвращает две строки
ROLLBACK;
SELECT * FROM TEST; -- возвращает одну строку

RELEASE SAVEPOINT

Назначение

Удаление точки сохранения.

Доступно в

DSQL

Синтаксис
RELEASE SAVEPOINT sp_name [ONLY]
Table 1. Параметры оператора RELEASE SAVEPOINT
Параметр Описание

sp_name

Имя точки сохранения.

Оператор RELEASE SAVEPOINT удаляет именованную точку сохранения, освобождая все связанные с ней ресурсы.По умолчанию удаляются также все точки сохранения, создаваемые после указанной.Если указано предложение ONLY, то удаляется только точка сохранения с заданным именем.

См. также:

SAVEPOINT.

docnext count = 2

Внутренние точки сохранения

По умолчанию сервер использует автоматическую системную точку сохранения уровня транзакции для выполнения её отката.При выполнении оператора ROLLBACK, все изменения, выполненные в транзакции, откатываются до системной точки сохранения и после этого транзакция подтверждается.

Когда объем изменений, выполняемых под системной точкой сохранения уровня транзакции, становиться большим (затрагивается порядка 50000 записей), сервер освобождает системную точку сохранения и, при необходимости отката транзакции, использует механизм TIP.

Tip

Если вы ожидаете, что объем изменений в транзакции будет большим, то можно задать опцию NO AUTO UNDO в операторе SET TRANSACTION, или — если используется API — установить флаг TPB isc_tpb_no_auto_undo.В обеих вариантах предотвращается создание системной точки сохранения уровня транзакции.

Точки сохранения и PSQL

Использование операторов управления транзакциями в PSQL не разрешается, так как это нарушит атомарность оператора, вызывающего процедуру.Но Firebird поддерживает вызов и обработку исключений в PSQL, так, чтобы действия, выполняемые в хранимых процедурах и триггерах, могли быть выборочно отменены без полного отката всех действий в них.Внутренне автоматические точки сохранения используется для:

  • отмены всех действий внутри блока BEGIN …​ END, где происходит исключение;

  • отмены всех действий, выполняемых в хранимой процедуре/триггере (или, в случае селективной хранимой процедуры, всех действий, выполненных с момента последнего оператора SUSPEND), если они завершаются преждевременно из-за непредусмотренной ошибки или исключения.

Каждый блок обработки исключений PSQL также ограничен автоматическими точками сохранения сервера.

Note

Сами по себе блок BEGIN …​ END не создаёт автоматическую точку сохранения.Она создаётся только в блоках, которых присутствует блок WHEN для обработки исключений или ошибок.