Как откатить каждую вставку, если отсутствует какая-либо проверка

Я должен вставить данные из XLM в 10 таблиц, иерархия, как показано ниже.

  • T1 имеет дочерний стол T2
  • У T2 есть дочерние таблицы t3,t4,t5,t6 и т. Д. До t10
  • Если какая-либо из проверок завершится неудачей от t3 до t10 выше t1, вставка таблиц t2 должна откатиться.

Я использую SavePoint, и, если какая-либо проверка отсутствует, я откатю эту конкретную точку сохранения.

Мой вопрос здесь: мне нужно использовать 10 точек сохранения, чтобы откатить транзакцию всех таблиц, или достаточно только одной точки сохранения?

1 ответ

Решение

Если какая-либо из проверок завершится неудачей от t3 до t10 выше t1, вставка таблиц t2 должна откатиться.

Таким образом, вы имеете в виду, что если что-то пойдет не так во время вставки в T3..T10, вы хотите, чтобы вся транзакция откатилась до начальной точки, т.е. любые вставки в T1 и T2 также должны откатываться.

Тогда зачем вообще создавать точку сохранения. Просто введите ROLLBACK, он откатит все вставки, всю транзакцию.

В любом случае, если вам действительно нужно, то сначала создайте SAVEPOINT, прежде чем начинать любую транзакцию на T1. Теперь, если какая-либо проверка завершится неудачно, ROLLBACK TO SAVEPOINT, которая откатит всю транзакцию.

ROLLBACK TO SAVEPOINT означает, что любая транзакция, произошедшая после этой конкретной SAVEPOINT, будет откатываться до этой точки сохранения.

Например,

SQL> SAVEPOINT A    

SQL> INSERT INTO TEST VALUES (1,'Savepoint A');

1 row inserted.    

SQL> SAVEPOINT B    

SQL> INSERT INTO TEST VALUES (2,'Savepoint B');

1 row inserted.    

SQL> ROLLBACK TO B;    

Rollback complete.    

SQL> SELECT * FROM TEST;    

ID  MSG  
--------    -----------   
1           Savepoint A

Пример источника

Другие вопросы по тегам