Перейти к основному содержимому

SAVEPOINT

примечание

Эта страница переведена при помощи нейросети GigaChat.

SAVEPOINT - создание новой точки сохранения внутри текущей транзакции.

Синтаксис

SAVEPOINT savepoint_name

Описание

SAVEPOINT создает новую точку сохранения внутри текущей транзакции.

Точка сохранения — это специальная метка внутри транзакции, к которой можно откатиться, отменив все команды, выполненные после ее создания, и восстановив состояние транзакции на тот момент.

Параметры

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

Примечания

Используйте ROLLBACK TO SAVEPOINT, чтобы откатиться к точке сохранения.

Чтобы удалить точку сохранения, но сохранить изменения, выполненные после нее — используйте RELEASE SAVEPOINT.

Точки сохранения можно создавать только внутри транзакционного блока (BEGIN ... COMMIT/ROLLBACK). В одной транзакции может быть несколько точек сохранения.

Примеры

Установление точки сохранения и затем отмена действия всех команд, выполненных после установленной точки:

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 поведение другое: старая точка сохраняется, но становится временно недоступной. При выполнении ROLLBACK TO SAVEPOINT или RELEASE SAVEPOINT будет использоваться только последняя из точек с таким именем. Если удалить последнюю точку с этим именем (RELEASE SAVEPOINT), то предыдущая снова станет доступной. В остальном команда полностью соответствует стандарту SQL.

Смотрите также

BEGIN, COMMIT, RELEASE SAVEPOINT, ROLLBACK, ROLLBACK TO SAVEPOINT