TOPサーバ構築・運用> 複数トランザクションの同時実行性
徹底比較!! PostgreSQL vs MySQL
徹底比較!! PostgreSQL vs MySQL

第3回:トランザクションの比較
著者:NTTデータ   藤塚 勤也   2006/5/8
前のページ  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  次のページ


NTTデータ  藤塚 勤也
著者プロフィール
株式会社NTTデータ   藤塚 勤也
基盤システム事業本部 オープンソース開発センタ シニアスペシャリスト。
日本タンデムコンピューターズ(現日本HP)を経て、2003年よりNTTデータにてOSS分野に参画。日頃はオリジナルOSSの開発や、OSSを用いたシステム構築への技術支援に従事。「RDBMS解剖学」(翔泳社)を共著。

INDEX
第3回:トランザクションの比較
  はじめに
  トランザクション機能を持たないMySQL+MyISAMエンジン
複数トランザクションの同時実行性
  トランザクションの分離レベルの注意点