2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

マテリアライズド・ビューの完全リフレッシュで一時的にデータが消える

Posted at

はじめに

マテビューリフレッシュのタイミングにマテビューからのデータ取得処理が走っており、
その時に意図しないNullPointerExceptionが発生していました。
必ずヒットするマテビューなのでコードを見ても原因を特定できず、
リフレッシュ回りを調べてみたところ「なるほど…」となったため備忘録として残します。

環境

oracle:12.2.0.1.0

原因

こちらで紹介してくださっていますが、

 ・atomic_refreshtruedeleteによってデータを削除する
 ・atomic_refreshfalsetrancateによってデータを削除する

という違いがあるようです。

現状のリフレッシュ処理を確認すると、以下のようにfalseが設定されていました。

exec dbms_mview.refresh(list=>'&1',method=>'C',atomic_refresh=>FALSE);

deleteはトランザクションが効き、trancateはトランザクションが効きません。
そのためatomic_refreshfalseでリフレッシュするとテーブルの中身が無くなるタイミングが生じます。

結果

trancateを用いたリフレッシュが動いたことで一時的にテーブルの中身が無くなり、
そのタイミングで取得処理が動いたことによってデータが取得できずに
NullPointerExceptionが発生していたようです。

最後に

atomic_refreshtrueにすることでエラーは発生しなくなりそうですが、
今度はdeleteでどれくらい時間がかかるか調べる必要がありそうです。

どなたかの参考になりましたら幸いです。

参考

マテリアライズド・ビューのリフレッシュ動作を試す

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?