SAVEPOINT#

SAVEPOINT

SAVEPOINT

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