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