2009-05-06 22 views
4

私は最近、Oracleのマテリアライズド・ビューをリフレッシュするdbms_mview.refresh(...)の呼び出しに暗黙のコミットがあることに気付きました。DBMS_MVIEW.REFRESHに暗黙的なコミットがあるのはなぜですか?

「これが原因で」以外のアイディア - このアクションに暗黙のコミットがある理由を教えてください。

+0

使用しているOracleのバージョンはどれですか? – David

+0

私はOracle 10g(10.2)を使用しています –

答えて

1

Oracleのバージョンおよび/またはdbms_mview.refreshに指定するパラメータによっては、TRUNCATEの後に直接ロードが行われる場合があります。 TRUNCATEはDDLコマンドであり、暗黙のコミットを発行します。直接ロードはコミットを必要としません。

もっと最近のバージョンのOracleを使用している場合は、10.2+と考えると、atomic_refreshパラメータをTRUEに設定し、標準のDELETE/INSERTを使用して1つのトランザクション内で更新します。しかし、この方法はかなり遅くなる可能性があります。

+1

atomic_refreshがtrueの場合でも暗黙的なコミットは行われますが、TRUNCATE/DELETEの動作については正しいです。 –

+0

清算していただきありがとうございます。 – David

+0

Yep - リフレッシュメカニズムに関係なく、暗黙のコミットによって動作が一貫していると仮定します。 –

4

トム・キテによれば、a decision was made at design time to consider refreshing to be a DDL operationです。すべてのDDL操作は暗黙的にコミットするので、これも同様です。不幸にも、彼はなぜそれがDDLを作ることを選んだのかという結果的な質問に答えません。

+0

トムは素晴らしいですが、彼はこれらの「理由があるから」答えてしまう傾向があります。 –

+0

はい、彼はそうです、そして、彼らは誰も答えることができないという質問に通常です。 –

0

自律型トランザクションでは、dbms_mview.refreshの呼び出し(プラグマautonomous_transactionを使用したPL/SQLプロシージャの作成)が必要です。

+0

この場合は、リフレッシュされたビュー自体が不正になった場合に、リフレッシュをロールバックできるようにしたかったのです。 –

関連する問題