TOPサーバ構築・運用> トランザクション機能を持たないMySQL+MyISAMエンジン
徹底比較!! PostgreSQL vs MySQL
徹底比較!! PostgreSQL vs MySQL

第3回:トランザクションの比較
著者:NTTデータ   藤塚 勤也   2006/5/8
前のページ  1  2  3  4  次のページ
トランザクション機能を持たないMySQL+MyISAMエンジン

   MyISAMエンジンを使用する場合では、トランザクション処理を行えません。しかしMyISAMエンジンのテーブルに対して更新処理が行えないわけではありません。SQL文でいえば、INSERT、UPDATE、DELETEすべての構文が実行可能です。

   またMyISAMエンジンは、トランザクション機能をサポートするPostgreSQLやInnoDBエンジンに比べ、データ更新処理が非常にシンプルに実装されています。

   PostgreSQLとInnoDBエンジンは、共有メモリ/バッファ内にトランザクションログ用とユーザデータ用のエリアを用意し、データ更新処理はこの共有メモリ・バッファ内のデータに対して行います。

   この時、発生するトランザクションログも共有メモリ/バッファ内のエリアに書き込みます。そして、トランザクションがコミットした時点で、トランザクションログの内容のみをログファイルに書き込みます。変更されたユーザデータはチェックポイントのタイミングで、まとめてディスク上のファイルへ書き込む方式で採用しています。

   この方式に対してMyISAMエンジンは、ユーザデータの更新時(INSERT文やUPDATE文の処理時)に、この共有メモリ/バッファ内のデータを書き換えるのではなく、直接ユーザデータのファイルへの書き込む方式になっています。

   このように、MyISAMエンジンは、トランザクション機能をサポートしないかわりに、トランザクションログや共有メモリ/バッファ、チェックポイントなどの複雑な仕組みを持っていません。


トランザクションログの種類

   トランザクション機能を実現する上で必要となるログには、UNDOログと呼ぶ変更前のデータとREDOログと呼ぶ変更後のデータの2つがあります。

   UNDOログは、トランザクションがロールバックした時、データベース内をトランザクション開始前の状態に戻すために使用します。

   RDBMSはトランザクションがコミットしたにも関わらず、障害などの理由によって変更データをデータベースに反映できない状況が発生しても、障害復旧手順にて変更データを保証する仕組みを備えています。この障害復旧時に、変更データをデータベースに反映する処理をロールフォワード処理と呼び、REDOログを使用します。


PostgreSQLのトランザクションログ

   PostgreSQLは、トランザクションログのファイル群をデータベースディレクトリ内のサブディレクトリ「pg_xlog」に格納します。「pg_xlog」ディレクトリには、REDOログを記録するログファイル群を格納します。

   このログファイル群は、16MByteのファイルの集合として構成しており、ファイル名は「0000000000000000」からはじまる16桁の16進数を使用します。

   なおPostgreSQLは、UNDOログ用のログファイルや格納エリアを持っていません。なぜならば、追記型構造にてテーブルデータを実装しているため、変更前のデータは必ずそのテーブルファイル内に存在しているからです。

   UNDOログ相当のデータをテーブル内に格納している追記型の利点は何でしょうか。

   通常RDBMSがトランザクションをロールバックする際には、INSERTされたレコードを削除し、UPDATEされたレコードはUNDOログを使用して更新する必要があります。この処理は、ロールバックするトランザクションにて行った変更レコードの量が多ければ多いほど時間を要します。PostgreSQLは、追記型構造のためINSERTもUPDATEも新しいレコードを追加することになります。

   そして、トランザクションがロールバックした場合は、追加されたレコードを無効扱いにするだけで、削除する必要はありません。なおかつ、トランザクション開始前のレコードは更新されていないため、UNDOログによる更新処理の必要もありません。

   よって、PostgreSQLはロールバック処理に要する時間が少なくて済む特徴を持っています。ただし、無効扱いにされたレコードは不要データであるため、定期的にVacuum処理する必要があります。


InnoDBエンジンのトランザクションログ

   InnoDBエンジンは、トランザクションログのファイル群としてデータベースディレクトリ内に存在する「ib_logfole0」ファイルと「ib_logfile1」ファイルを使用します。

   このファイル群のファイル数は設定することが可能で、デフォルトでは2つとなっています。ファイルサイズも設定可能です。InnoDBエンジンは、「ib_logfole0」ファイルと「ib_logfile1」ファイルを循環的に使用してREDOログを記録します。

   またInnoDBエンジンは、テーブルスペース内にロールバックセグメントと呼ぶエリアを設け、UNDOログを記録します。このUNDOログは、不要になった時点で自動的に削除されます。しかし、テーブルスペース用のデータファイルは、ユーザデータの増加だけではなく、大量のUNDOログを必要とするトランザクションを実行することによって、多くのエリアを使用してしまう可能性を持っています。

   なお、このロールバックセグメントを使用したUNDOログの格納方式は、Oracleの方式に類似しています。

前のページ  1  2  3  4  次のページ


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

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