|
||||||||||||||
| 前のページ 1 2 3 4 次のページ | ||||||||||||||
| 複数トランザクションの同時実行性 | ||||||||||||||
|
RDBMSは、複数のトランザクションが同時に実行された場合において、個々のトランザクションにおけるデータの一貫性を保ちつつ、可能な限り同時実行性を向上させます。そのためPostgreSQLとMySQL+InnoDBエンジンは、ともにMVCC(Multiversion Concurrency Control)と呼ぶ機能を持っています。 MVCC機能があると、ロックを獲得することなくデータの一貫性を保った読み込みトランザクションを実行することができます。よってロックの獲得待ちをすることなく、同時に更新トランザクションを実行することが可能になるため、トランザクションの同時実行性が向上します。これをOracleでは、これを読み込み一貫性機能と呼んでいます。 |
||||||||||||||
| PostgreSQLのMVCC | ||||||||||||||
|
PostgreSQLは、トランザクションの開始時にXIDと呼ぶ各トランザクションを識別する値を発番し、そのトランザクションによって追加されたレコード内にXID値を格納します。 例えば「XID=400」のトランザクションにて生成されたレコード1〜8のテーブルを、「XID=500」のトランザクションによってレコード1から読み込みを開始された状況にて、他のトランザクションが「XID=501」にてレコード5を更新したとします。 PostgreSQLのテーブルは追記型構造のため「XID=501」の値を持つ新たなレコード5が追加されるとともに、もとのレコード5には削除フラグが立ち「XID=501」となります。しかし「XID=500」の読込みがレコード5に達した時には、レコード5には2種類のバージョンが存在しています。 ここで最新のレコード5を読み込んでしまう(コミット前ならダーティーリードになる)と、「XID=500」のトランザクション開始時点での状態とは異なるため一貫性を失ってしまいます。 そこで「XID=500」のトランザクション、最新のレコード5は、「XID=501」であるため、自身のトランザクション(XID=500)開始後のものと判断し、削除フラグの立った古いバージョンのレコード5を読み込みます。 さらにここまでの動作にて、一切データのロックを行っていないことが重要です。このようにPostgreSQLは、テーブルの追記型構造の特徴を利用し、非常にシンプルな仕組みにてMVCCを実現しています。 |
||||||||||||||
| InnoDBエンジンのMVCC | ||||||||||||||
|
InnoDBエンジンのテーブルは追記型構造ではないため、更新前のデータが常に存在しているわけではありません。そこでInooDBエンジンは、ロールバックセグメント内のUNDOログを使用してMVCCを実現しています。 InooDBエンジンのテーブルのレコードでも、PostgreSQLのXIDと同様に、トランザクションIDと呼ぶトランザクションを識別する値が格納されています。そこで、このトランザクションのID値を使用して、ロールバックセグメントの内容を読み込むか、テーブルの内容を読み込むかを判断します。このあたりはPostgreSQLと同等の仕組みです。 |
||||||||||||||
|
前のページ 1 2 3 4 次のページ |
||||||||||||||
|
|
||||||||||||||
|
|
||||||||||||||
|
||||||||||||||
|
|
||||||||||||||
|
||||||||||||||
|
|
||||||||||||||
|
||||||||||||||

