SAVEPOINT

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


Синтаксис

SAVEPOINT имя_точки_сохранения

Описание

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

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


Параметры

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

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


Примечания

Для отката к точке сохранения воспользуйтесь командой ROLLBACK TO SAVEPOINT. Для уничтожения точки сохранения с сохранением изменений, произведенных командами после того, как она была установлена, воспользуйтесь командой 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 SAVEPOINT my_savepoint;
    SELECT * FROM table1;               -- выводит строки 1 и 2

    -- освобождение второй точки сохранения
    RELEASE SAVEPOINT my_savepoint;

    -- откат к первой точке сохранения
    ROLLBACK TO SAVEPOINT my_savepoint;
    SELECT * FROM table1;               -- выводит только строку 1
COMMIT;

Вышеуказанная транзакция показывает, что сначала откатилась строка 3 а затем строка 2.


Совместимость

Стандарт SQL требует, чтобы точка сохранения уничтожалась автоматически при установке другой точки сохранения с тем же именем. В QHB сохраняется и старая точка сохранения, хотя при откате или освобождении будет использоваться только самая последняя точка. (Освобождение новой точки сохранения с помощью RELEASE SAVEPOINT приведет к тому, что старая точка сохранения снова станет доступной для команд ROLLBACK TO SAVEPOINT и RELEASE SAVEPOINT.) В остальном команда SAVEPOINT полностью соответствует стандарту SQL.

См. также

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