web-dev-qa-db-ja.com

複数の読み取りにわたってデータの一貫性を保証する方法は?

私のアプリケーションがデータベースからさまざまな情報を収集するために(異なるテーブルに対して)一連のSELECTを実行する必要があり、データの収集中にこれらのテーブルを変更したくない場合を考えてみましょう。 postgresqlを使用すると、「繰り返し読み取り」または「シリアライズ可能」分離レベルを使用できますが、次の一連のアクションとして、別のトランザクションがまだ参照していないテーブルへの変更をコミットすると、トランザクションがすでに開始している場合でもそれらが表示されますショー:

T1: BEGIN ISOLATION LEVEL SERIALIZABLE;    # imagine here table t has 10 rows
T2: INSERT INTO t VALUES(1, 2, 3);
T1: SELECT COUNT(*) FROM t;                # we'll see 11 lines for the rest of the transaction

ただし、T2が挿入を行う前にT1がtにアクセスした場合、トランザクション全体の期間中に10行表示されます。

T1: BEGIN ISOLATION LEVEL SERIALIZABLE;    # imagine here table t has 10 rows
T1: SELECT COUNT(*) FROM t;                # we'll see 10 lines for the rest of the transaction
T2: INSERT INTO t VALUES(1, 2, 3);
T1: SELECT COUNT(*) FROM t;                # still sees 10 lines etc.

上記の動作により、トランザクション中に複数のテーブルにアクセスする必要がある場合、それらの多くはトランザクションの開始からアクセスする瞬間までの時間間隔で変化する可能性があり、これらの変化は表示されません見たい。私はそれが分離レベルが機能するはずの方法であることを理解しているので、ここでは説明は必要ありません。

しかし、それでは、ある時点で開始するある種の「スナップショット」を作成する方法はありますか?この場合、明示的なロックが必要ですか?

1
homer5439

それは問題ではない。

シリアル化可能なトランザクション(この場合は反復可能な読み取りを使用する必要があります。パフォーマンスが向上し、同じことを行います)は、最初の選択を実行すると効果的に開始され、同じトランザクション内のすべてのステートメントはデータベースの同じスナップショットを参照します。

したがって、すべてが一貫しています。

1
Laurenz Albe