0

xlm から 10 個のテーブルにデータを挿入する必要があります。階層は次のとおりです。

  • T1 には子テーブル T2 があります
  • T2には、t10まで子テーブルt3、t4、t5、t6などがあります
  • t1 より上の t3 から t10 でいずれかの検証が失敗した場合、t2 テーブルの挿入はロールバックする必要があります。

SavePoint を使用していますが、検証が欠落している場合は、その特定のセーブポイントをロールバックします。

ここでの私の質問は、10 個のセーブポイントを使用する必要があるので、すべてのテーブルのトランザクションをロールバックする必要がありますか、それとも 1 つのセーブポイントだけで十分ですか?

4

1 に答える 1

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

サンプルソース

于 2015-01-30T06:41:44.183 に答える