SAVEPOINT в Oracle SQL — как создать точку возврата

🟢SAVEPOINT в Oracle SQL. Введение

Представьте, что вы проводите серию изменений в таблицах, и хотите иметь возможность отменить часть этих изменений, не откатывая всё.
Именно для этого предназначен SAVEPOINT — он фиксирует внутреннюю метку в транзакции, к которой можно откатиться с помощью ROLLBACK TO.

🔄 Это особенно полезно в сложных процедурах, циклах и обработке ошибок.


🔤 Написание

sql

SAVEPOINT имя_точки;

— Для отката к этой точке:
ROLLBACK TO имя_точки;

🧮 Пример:

sql
SAVEPOINT before_update;
UPDATE employees SET salary = salary * 2 WHERE department_id = 10;
ROLLBACK TO before_update;

🔄 Где часто используется

  • Многошаговые операции, где нужно контроль за этапами

  • Циклическая обработка (например, массовые загрузки)

  • Частичный откат в процедуре или PL/SQL блоке

  • Тестирование бизнес-логики с шагами

  • Верификация данных перед COMMIT


🧪 10 Примеров использования с пояснениями

1️⃣ Создание точки и возврат к ней

sql

SAVEPOINT sp1;

UPDATE employees SET job_id = ‘DEV’ WHERE department_id = 50;

ROLLBACK TO sp1;

Обновление отменяется, остальное — остаётся.


2️⃣ Несколько SAVEPOINT в одной транзакции

sql
SAVEPOINT step1;
DELETE FROM temp_data;
SAVEPOINT step2;
UPDATE temp_data SET flag = ‘N’;ROLLBACK TO step1;

Оба действия будут отменены.


3️⃣ Откат только к последнему SAVEPOINT

sql
SAVEPOINT A;
UPDATE table1 SET col = 'X';
SAVEPOINT B;
UPDATE table2 SET col = ‘Y’;ROLLBACK TO B;

table2 вернётся, table1 — останется.


4️⃣ Работа в PL/SQL блоке с логикой

sql
BEGIN
SAVEPOINT before_insert;
INSERT INTO orders VALUES (101, ‘New’);IF SYSDATE > TO_DATE(‘01.01.2100’, ‘DD.MM.YYYY’) THEN
ROLLBACK TO before_insert;
END IF;COMMIT;
END;

Откатим вставку по условию.


5️⃣ Использование в цикле

sql
BEGIN
FOR r IN (SELECT * FROM big_data) LOOP
SAVEPOINT row_save;
BEGIN
UPDATE big_data SET processed = ‘Y’ WHERE id = r.id;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK TO row_save;
END;END LOOP;COMMIT;
END;

Откат для конкретной строки, не всей сессии.


6️⃣ SAVEPOINT + COMMIT

sql
SAVEPOINT A;
UPDATE a_table SET col = 1;
COMMIT;— Теперь SAVEPOINT A больше не существует.

После COMMIT все точки сбрасываются.


7️⃣ Переиспользование имени SAVEPOINT

sql

SAVEPOINT step;

— какие-то изменения…

SAVEPOINT step;

— Теперь предыдущий step потерян, остался только последний.

Важно: имя SAVEPOINT перезаписывается.


8️⃣ Проверка поведения после ROLLBACK TO

sql
SAVEPOINT p1;
INSERT INTO test VALUES (1);
SAVEPOINT p2;
INSERT INTO test VALUES (2);ROLLBACK TO p2; — Удалится только запись (2)

Запись (1) останется в транзакции.


9️⃣ Ошибка при неверной точке

sql
ROLLBACK TO unknown_point;
-- ORA-01086: savepoint 'UNKNOWN_POINT' never established

Точка должна существовать в текущей сессии и до COMMIT.


🔟 Сложная логика с несколькими действиями

sql
BEGIN
SAVEPOINT start;
DELETE FROM orders WHERE status = ‘canceled’;
SAVEPOINT after_delete;UPDATE orders SET status = ‘archived’ WHERE order_date < SYSDATE 365;
ROLLBACK TO after_delete;COMMIT;
END;

Удаление сохраняется, обновление — отменяется.


🧩 Заключение

SAVEPOINT — мощный механизм, позволяющий контролировать ход транзакции на каждом этапе. Он особенно полезен в сценариях, где нужен частичный откат или обработка ошибок. Используя SAVEPOINT и ROLLBACK TO, вы получаете гибкий и надёжный контроль над данными.

💡 Запомни:

  • SAVEPOINT создаёт метку внутри транзакции

  • ROLLBACK TO возвращает к ней, не отменяя всё

  • После COMMIT все точки теряются

  • Поддерживает сложную логику в PL/SQL


🔜 Следующая статья:

ROLLBACK в Oracle SQL — как отменить изменения и защититься от ошибок в транзакциях


Понравилась статья? Поделиться с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии