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