 |

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