トランザクション処理
![]()
ハイブリッド メモリデータベースでの同時性制御は、従来のRDBMSとは異なる特徴を持っています。ハイブリッド メモリデータベースは、従来のRDBMSより10倍以上のパフォーマンスを達成できるため、高速なデータ処理が強く要求される領域で使用されます。そのため、できるだけ同時性制御にかかるコストが少なくし、データベース全体の性能をアップさせなければならないという要件が存在します。
伝統的な2PL(two phase locking)プロトコルを使うデータベースでは、仮に該当ロックのレベルがレコードだとしても、該当レコードに対する変更処理が発生すると、該当レコードに対する読込み処理が遅延する問題が発生します。また、特定のレコードに対する読込み処理が発生した後は、そのトランザクションがcommitされるまで、そのレコードに対する変更トランザクションが待ち状態となる状況も発生します。更に、大量のレコードに対する読込みまたは変更処理が発生した場合は、レコードに対する読込みや書込みコストより同時性制御を行うロックに対する処理演算により多くコストがかかることになり、ロックエスカレーション(Escalation)が発生しトランザクション性能が低下する危険性があります。
Altibaseが提供するマルチバージョン技法は、トランザクション実行時間に対し、それぞれ異なったバージョンを維持するため、レコードレベルの読込み処理は、変更処理と関係なく進めることができ、変更処理も読込み処理とは関係なく進めることができます。
特に、Altibaseは、レコードレベルのロックメカニズムをサポートしつつ、該当レコードに対するロック情報を直接レコード内部に保存するため、ロック処理にかかるコストがほとんどゼロに近いだけでなく、読込み処理の場合は、ロック情報を持たずに処理を進められるように設計されました。また、一つのトランザクションが大量のレコードに対して読込みや変更処理を実行しても、ロック管理に対するコストがほとんど発生しないため、高速な応答速度を保証します。
Altibaseは、メモリテーブルやディスクテーブルに対し、外見上は同じ機能を提供しますが、異なる実装方式でMVCCを実現しています。メモリテーブルは、行を変更する度に新しいバージョンを生成するout-place MVCCで実現されており、ディスクテーブルの場合は、変更されたデータを既存の行に上書きし、変更前の情報をundo table spaceに保存して参照するin-place MVCC方式を採用しています。
ハイブリッド メモリデータベースが、メモリ方式のout-placeマルチバージョン技法をサポートすることにおいて負担となる部分は、トランザクションがそれ以上アクセスできない前のバージョンのレコードに対する処理です。ハイブリッド メモリデータベースは、システムメモリを持続的に使うため、削除・変更されたレコードを解放しなければ、システムが使用可能なメモリを全部使い切ってしまう可能性があります。
このような理由からハイブリッド メモリデータベースでは、必要のないレコードまたはインデックスノードが存在した場合、すぐ回収して再利用できるメカニズムが必要です。Altibaseでは、このような役割をするガーベージコレクション(Garbage Collection)スレッドを生成し、最適なメモリ状態が維持できるよう保障します。
![]()
Altibaseは、ハイブリッド メモリデータベースの構造に合わせて最高の性能が出せるトランザクション構造やそれと関連した様々な機能を提供します。
Altibaseは、マルチバージョン技法(MVCC:Multiversion Concurrency Control)を利用して同時性制御を行いますが、一般的なトランザクション管理技法では、最適の性能を発揮することがが困難です。MVCC環境では、特定の時点に特定のレコードに対するアクセスを行った他のトランザクションの状態、つまり現在実行中なのか、あるいは既に終了したものなのかなどの情報を数ナノ秒(nano sec)内に決めなければならない制約が存在しますが、このような判断のためのコストが多くかかる場合、マルチバージョン技法の処理コストが非常に大きくなり、返って逆効果となるためです。
このような要件を満たすためにAltibaseでは、トランザクションプール(Transaction Pool)を維持し、そのプールに対する直接的なアクセスにより高速にトランザクションの実行の有無を判断できるようにしています。特に、トランザクションプールを予め作成しておく構造は、デッドロック(Dead Lock)処理にも大きなメリットを持ちます。一般的なデッドロック検知技法は、トランザクションの間にサイクルが存在するのかどうかを検査する別のプロセスあるいはスレッドが存在し、一定周期で全ての使用中のトランザクションを検査するものです。この構造は、必然的にデッドロックに参加したトランザクションの一時的なサービスの中止をもたらします。高速な応答速度を保障しなければならないハイブリッド メモリデータベースにおいて、デッドロックが発生した後、一定時間の間サービスが中止されるということは極めて致命的な結果をもたらすため、このようなデッドロック検知技法は適切ではありません。この問題を解決するため、Altibaseでは、トランザクションのロック要求の際に、トランザクションプールを利用して即時に非常にデッドロックを発生させたかどうかを検査するアルゴリズムを適用し、デッドロックによるトランザクションの致命的な遅延現象を根本的に解決しています。
また、Altibaseのトランザクションの分離レベル((isolation level)は、commit readを基本として、repeatable readやno phantom readレベルを動的にサポートするため、ユーザの必要に合わせて適切な分離レベルを選択して使うことができます。