、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のソースコードを読んでいませんが、答えを知っている人はいますか?
あなたの質問は何ですか?隔離レベルは、ステートメントではなく、他の**トランザクション**への変更の可視性に関するものです。 –
申し訳ありませんが、私は私の質問を編集して詳細な説明をします。 – kingluo
CTEまたはサブクエリは、まだ**シングル**ステートメントです。 –