Oracleの組み込み認証メカニズムを使用してユーザーアカウントとパスワードを管理するアプリケーションに取り組んでいます。アプリケーションは行レベルのセキュリティも使用します。基本的に、アプリケーションを介して登録するすべてのユーザーは、「USERS」テーブルの通常のエントリではなく、Oracleのユーザー名とパスワードを取得します。ユーザーは、特定のテーブルのラベルも受け取ります。このタイプの機能では、多くの場合、DMLステートメントとDDLステートメントの実行を組み合わせる必要がありますが、DDLステートメントは暗黙的なコミットを実行するため、これは問題を引き起こします。DDLステートメントの実行後にエラーが発生した場合、トランザクション管理はすべてをロールバックしません。たとえば、新しいユーザーがシステムに登録すると、次のことが発生する可能性があります。
- トランザクションを開始します
- 人物の詳細をテーブルに挿入します。(つまり、名、姓など)-DML
- Oracleアカウントを作成します(パスワードで識別されるユーザーtestuserを作成します;)-DDL暗黙的コミット。トランザクションは終了します。
- 新しいトランザクションが開始されます。
- より多くのDMLステートメント(挿入、更新など)を実行します。
- エラーが発生し、トランザクションはステップ4にのみロールバックします。
上記のロジックが設計どおりに機能していることは理解していますが、このタイプの機能を単体テストしてデータアクセス層で管理するのは難しいと感じています。データベースがダウンしたか、単体テスト中にエラーが発生したため、ロールバックする必要のあるテストデータでテストスキーマが汚染されました。これが発生したときにテストスキーマをワイプするのは簡単ですが、実稼働環境でのデータベースの障害が心配です。これを管理するための戦略を探しています。
これはJava/Springアプリケーションです。Springはトランザクション管理を提供しています。