2017-05-25 9 views
4

で可能がありますか?値9を持つレコードを選択クエリにはまだ表示されていないときレースの条件は、配列から読み出しのために利用できるようになる典型的な自動インクリメントフィールドを使用して、その下の表に作成されたレコードの任意の条件は、PostgreSQLの自動インクリメント

たとえば、値10を持つレコードは、これまでSELECTクエリの結果に表示されるだろうか?

私の質問の目的は、1つのクエリから取得された最大値を下限として使用して、後で実行されたクエリで以前に取得されなかった値を特定することができますか?

競合状態のようなものは、いくつかの状況下で可能である場合、その問題に免疫があるselectクエリのために使用することができる分離レベルのいずれかがありますか?

答えて

3

はい、それについて考えるあなたのために良いです。

あなたは自明それは任意の生成された値nのためにそれを想定するは安全ではない、生成されたすべてのです

SESSION 1     SESSION 2      SESSION 3 
BEGIN;  
          BEGIN; 
INSERT INTO x(n) VALUES(1) 
          INSERT INTO x(n) VALUES (2); 
          COMMIT; 
                  SELECT * FROM x; 
COMMIT; 
                  SELECT * FROM x; 

その後、いくつかのテーブル

CREATE TABLE x (
    seq serial primary key, 
    n integer not null 
); 

を与え、3つの同時psqlのセッションでこれを証明することができます値n-1はすでにコミットされているか、すでに打ち切られたxactによって使用されています。彼らはnを参照した後、進行中でコミットしている可能性があります。

私は、分離レベルは本当にここであなたを助けるとは思いません。 SERIALIZABLEが検出する相互依存関係はありません。あなたがコミット順に一貫した流れを得ることができるので、論理的な復号化が、追加された理由

これは一部です。

関連する問題