DBMS_MVIEW.REFRESHに暗黙のコミットがあるのはなぜですか?
-
06-07-2019 - |
質問
最近、Oracleのマテリアライズドビューを更新するdbms_mview.refresh(...)を呼び出すと、暗黙のコミットがあることに気付きました。
任意のアイデア-「するから」以外-このアクションに暗黙のコミットがあるのはなぜですか?
解決
Oracleのバージョンやdbms_mview.refreshに指定したパラメーターによっては、TRUNCATEを実行してから直接ロードする場合があります。 TRUNCATEはDDLコマンドであるため、暗黙的なコミットを発行します。直接ロードではコミットは不要です。
より新しいバージョンのOracleを使用している場合、10.2以上と考えられます。atomic_refreshパラメーターをTRUEに設定すると、標準のDELETE / INSERTを使用して、単一のトランザクション内で更新されます。ただし、この方法はかなり遅い可能性があります。
他のヒント
Tom Kyteによると、設計時に、更新をDDL操作と見なすことを決定しました。すべてのDDL操作は暗黙的にコミットするため、これも実行します。残念ながら、彼はなぜ彼らがそれをDDLにしたのかという結果として生じる質問には答えません。
回避策は、自律トランザクションでdbms_mview.refreshを呼び出すことです(pragma Autonomous_transactionを使用してPL / SQLプロシージャを作成します)。
所属していません StackOverflow