0

私は自分のウェブサイト用に 2 つのパスワードを保持しています (実際にはウェブサイトの人間のユーザーが知る限り同じパスワードですが、2 つの異なるアルゴリズムとソルトを使用してハッシュおよびソルト化されています)。1 つは WebUsers テーブルに配置され、ユーザーが Web サイトにログインするときにパスワードが検証される場所です。もう 1 つは oracle ユーザーのパスワードで、各 Web サイト ユーザーは oracle ユーザーに対応します。

パスワードの変更手順を行うとき、WebUsers テーブルと Oracle のパスワードをトランザクションで変更する必要があります。問題は、アクションを実行する前に DDL ステートメント [alter user ...] がコミットされることです。[alter user ...] が失敗し、例外処理コードでトランザクションをロールバックした場合、WebUsers テーブルの変更はロールバックされません。回避策はありますか?

4

1 に答える 1

0

Oracle では、DML と DDL を 1 つのアトミック トランザクションに含める方法はまったくありません。

Oracle aa DDL では、DDL を実行する前に常に明示的にコミットされます。

通常、この種のシナリオでは、最初に失敗する可能性が最も高いステップを実行する必要があります。つまり、この場合は DDL 'Alter User' です。

そして、DDL が成功した場合にのみ DML を実行しますが、DML が失敗し、DDL をロールバックできないというこの問題が発生します。その時点で、別の DDL を実行して元に戻す必要があります。最初の DDL によって行われた変更。

2 番目のステップは、最初のステップよりも失敗する可能性がはるかに高いという考えです。

このパターンも使用されます。たとえば、 JMS + JDBC などを処理する必要があり、JTA トランザクションを使用して JMS + JDBC アクティビティを単一のトランザクションにラップすることはできません。

于 2012-04-27T17:06:37.083 に答える