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

Мне нужно вставить данные из xlm в 10 таблиц, иерархия следующая.

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

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

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


person developer    schedule 30.01.2015    source источник
comment
Установите точку сохранения на t2 и откатитесь к точке сохранения t2, если вставка не удалась.   -  person Sathyajith Bhat    schedule 30.01.2015
comment
@Sathya, что, если проверка завершится неудачно в момент времени 8, отменит ли этот откат вставку 7 таблиц, если мы установим точку сохранения в момент времени 2?   -  person developer    schedule 30.01.2015
comment
Да, это будет. Но если вы создадите точку сохранения после T2, она не будет откатываться до T2.   -  person Lalit Kumar B    schedule 30.01.2015


Ответы (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

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

person Lalit Kumar B    schedule 30.01.2015