2016-04-17 6 views
1

、PostgreSQLは 「自動コミット」モードでトランザクションを実行する(BEGINなし)デフォルトではすなわち読み取りコミットされた分離レベルの正確なコマンド定義は何ですか?

、我々は、自動コミットモードを使用すると仮定しましょう、つまり、それぞれの文は、独自の のトランザクションで実行され、コミット暗黙的です ステートメントの最後に実行されます(実行が成功した場合は、それ以外の場合はロールバックが実行されます)。

コミットされた分離レベル(デフォルトではpostgresqlでも)は、実際の分離単位です。しかし、ここでの声明は外側の声明だけを意味するのですか同じ外部ステートメントに埋め込まれたステートメントはどうですか?

  • (クエリ付)CTE

私はいくつかの例をテスト、いくつかのクエリが原因依存関係に他の後に起こるかもしれないが、メインクエリとクエリWITHすべてが、同じトランザクションのスナップショットを共有しているようです。

with a as 
(
statements... 
), 
b as (
statements depends on a, e.g. from a, 
) 
main query 

クエリの実行中に新しいトランザクションがコミットされた場合、ここで新しいデータを参照する必要がありますか?トリガー機能で

それはテストし、トリガ関数内の各ステートメントは、コミット読取り分離レベルのルールを満たすことを知っているのは簡単だつまりただその前に、すべてのコミット済みトランザクションからのデータを見ることが各ステートメント実行を開始する。

文1をコミットした他のトランザクションがある場合、文2は新しいデータを参照します。

  • サブクエリ

WHERE部分に副問合せを考えてみましょうサブクエリがほとんどオプティマイザによって参加に変換されるため、サブクエリの各実行は、他のコミットされたトランザクションからの新しいデータを見ることがあれば、それはテストするのは難しいです。

select * from foo where col1 > any(select col1 from bar where ....); 

テーブルバーを修正サブクエリのセカンドラン、後にコミットいくつかの他のトランザクションは、サブクエリの3回目は、新しいデータを見ない場合は?

私はこのトピックに基づいてpostgresqlのソースコードを読んでいませんが、答えを知っている人はいますか?

+0

あなたの質問は何ですか?隔離レベルは、ステートメントではなく、他の**トランザクション**への変更の可視性に関するものです。 –

+0

申し訳ありませんが、私は私の質問を編集して詳細な説明をします。 – kingluo

+0

CTEまたはサブクエリは、まだ**シングル**ステートメントです。 –

答えて

1

私はpgsqlの-一般的なメーリングリストで質問を:、すべてのケースについて

(トリガー、CTE、他のサブクエリ):

http://www.postgresql.org/message-id/flat/[email protected]om#[email protected]om

をそして私は今、答えを見つけます これらがPLで書かれた関数を使用していれば、デフォルトではVOLATILEとマークされ、 の各クエリに新しいデータが表示されることがあります。VOLATILE関数は、彼らが実行する各クエリの開始時に新鮮 スナップショットを取得一方

http://www.postgresql.org/docs/current/static/xfunc-volatility.html

STABLEとIMMUTABLE関数は、呼び出し元のクエリの 開始として確立スナップショットを使用します。

関連する問題