質問

最近、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プロシージャを作成します)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top