3

Oracle データベースの 2 つの異なるスキーマ内のオブジェクトに対して DML を実行する単一の接続があります。のオブジェクトに関するトランザクションを完了してから、 のオブジェクトを操作schema Aする 2 番目のトランザクションを開始しますschema B。2 番目のトランザクションで作業中にエラーが発生した場合は、両方のトランザクションの変更をロールバックしたいと考えています。それは可能ですか?

4

2 に答える 2

2

両方のスキーマに加えられた変更を一緒にコミットまたはロールバックする場合は、単一のトランザクションを使用する必要があります。最初のトランザクションをコミットすると、2番目のトランザクションが失敗した場合、それをロールバックすることはできません(まあ、潜在的に、フラッシュバックテクノロジーを使用することはできますが、はるかに複雑になります)。ただし、両方のスキーマで実行している作業に単一のトランザクションを使用した場合は、すべての変更がアトミックにコミットまたはロールバックされるという希望の動作が得られます。

于 2012-08-16T19:28:31.620 に答える
1

Connection自動コミットしないように設定します(デフォルトでは自動コミットします)。例:

conn.setAutoCommit(false);

次に、最初のスキーマに対してDMLを実行し、同じ接続オブジェクトを使用して、2番目のスキーマに対してDMLを実行できます。何かが失敗した場合は、すべてをロールバックします。例:

conn.rollback();

それ以外の場合、すべてが成功した場合は、コミットします。

conn.commit(); 
于 2012-08-16T20:26:02.207 に答える