如果缺少任何验证,如何回滚每个插入

时间:2015-01-30 06:29:45

标签: oracle transactions savepoints

我必须将数据从xlm插入到10个表中,层次结构如下所示。

  • T1有子表T2
  • T2有子表t3,t4,t5,t6等,直到t10
  • 如果任何验证在t1以上的t3到t10失败,则t2表插入应该回滚。

我正在使用SavePoint,如果看到任何验证缺失,我将回滚该特定保存点。

我的问题是,我是否必须使用10个保存点,以便回滚所有表的事务或只有一个保存点就够了?

1 个答案:

答案 0 :(得分:1)

  

如果任何验证在t1以上的t3到t10失败,则t2表插入应该回滚。

所以你的意思是如果在插入T3..T10时出现任何问题,你希望整个事务回滚到初始点,即T1和T2的任何插入也应该回滚。

然后为什么要创建一个保存点。只需发出 ROLLBACK ,它就会回滚所有插入,整个事务。

无论如何,如果你真的需要,那么在开始T1上的任何事务之前先创建一个SAVEPOINT。现在,如果任何验证失败, 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

Example source