2016-10-17 6 views
0

私は、IF-THENブロックを持つPG内の関数、関数呼び出しでこのPostgresの - どのように1つのセッションで更新を他のセッションのためにすぐに見えるように

if <condition> then 
     ... 
     update mytab set col1=true; 
     <some long time operation> 
end if; 

のようなものを持っている(ブロックがあれば、その後に) mytabを更新して長い操作を続けると、他のセッションでmytab.col1がtrueであることがわかります(私はフラグのように使いたい)。

しかし、何が起こるかは、mytabは更新されていますが、このセッションでのみ表示されます。他のセッションでは、mytab.col1がまだfalseであることがわかります。 最初に長い操作(およびif-thenブロック全体)が終了したら、他のセッションはmytab.col1がtrueであることを確認します。

この更新プログラムをすぐに表示する方法(Oracle f.i.commitではこのトリックを行います)。

+0

明らかに単一のトランザクションではない「大規模な操作」を、それぞれ1つのトランザクションを実行する異なる機能に分割しないでください。 –

+0

こんにちは、実際にはトランザクションリフレッシュマテリアライズドビューであるため、longopを分割することはできません。どういうわけか私が欲しいのは、マット・ビューがデータベース内のプロセスをリフレッシュする瞬間です。私はpg_stat_activityをチェックできましたが、 'リフレッシュマテリアライズドビュー'コマンドは表示されませんが、関数全体が表示されます。 –

答えて

0

関数の完全な本体が1つのトランザクション内で実行されるため、これを行うことはできません。

唯一の回避策は、dblinkと で2つ目のデータベース接続を開き、そこで更新を実行(コミット)することです。

関連する問題