トランザクションとロックは、テーブル間の関係にとっては 2 番目に重要な要素にすぎません。データベースの整合性とパフォーマンスは、ロックを効率的に使用したりトランザクションを注意深く構成することで向上します。いずれも、多数のコマンドを同時実行する必要があるデータベースを作成する上で欠かせないことです。
トランザクションは、SQL 文をいくつかの作業の論理単位にグループ分けします。トランザクションを完了するには、すべての変更をロールバックするか、変更をコミットして永続的なものにします。
システム障害が発生したときにデータ・リカバリを行うためには、トランザクションが必要です。トランザクションは、同時に実行されるトランザクションの文を編成する上で中心的な役割を果たします。
パフォーマンスを向上させるには、複数のトランザクションを同時に実行する必要があります。各トランザクションは、コンポーネント SQL 文で構成されています。複数のトランザクションを同時に実行する場合、データベース・サーバは個々の文の実行をスケジュールします。トランザクションを同時に実行すると、順次実行の場合とは異なり、矛盾が生じる可能性があります。
独立性レベルの定義には、次の 4 種類の矛盾が使用されます。
ダーティ・リード あるトランザクションがデータを修正した後、コミットする前に別のトランザクションがそのデータを読み込んでしまうこと。
繰り返し不可能読み出し あるトランザクションが同じローを 2 度読み込んだ場合に、得られる値が異なること。
幻ロー トランザクションが特定の基準に従ってローを 2 回選択したときに、2 回目の結果セットに新しいローが含まれること。
更新内容の消失 トランザクションがローに対して行った変更が、別のトランザクションが前のデータを基にして更新内容を保存することを許可されたため、完全に消失してしまうこと。
スケジュールに従って文を実行した結果が、各トランザクションを順次実行した結果と同じ場合、そのスケジュールは直列化可能であるといいます。スケジュールが直列化可能である場合、それは「正しい」スケジュールと言えます。直列化可能なスケジュールは上記のような矛盾を引き起こしません。
ロックは、許可する干渉の量とタイプを制御します。SQL Anywhere では、独立性レベル 0、1、2、3 の 4 つのロック・レベルが使用できます。最も高い独立性レベル 3 では、SQL Anywhere はスケジュールが直列化可能であること、つまり、すべてのトランザクションを実行した結果とそれらを順次実行した結果が同じになることを保証します。
残念なことに、あるトランザクションが設定したロックが他のトランザクションの進行を妨げることがあります。この問題を解決するには、矛盾が許されるかぎり、低い独立性レベルを使用するのが得策です。独立性レベルが高いほどデータの一貫性は向上しますが、同時実行性は低下し、データベースがトランザクションを同時に実行する効率も低下します。オペレーションごとに最適な独立性を決定するには、一貫性とパフォーマンス向上のバランスを取る必要があります。
異なるトランザクション間でロックの競合が起きると、ブロックまたはデッドロックとなります。SQL Anywhere には、この両方を扱うメカニズムが含まれており、それらを制御するオプションを備えています。
しかし、独立性レベルの高いトランザクションが必ずしも同時実行性に影響を与えるわけではありません。他のトランザクションは、ロックされたローにアクセスする場合にだけ妨げられます。データベースとトランザクションを注意深く設計することで、同時実行性を向上させることができます。たとえば、1 つのトランザクションを 2 つの短いトランザクションに分割してロックが保持される時間を短縮したり、インデックスを追加して、独立性レベルの高いトランザクションを少ないロックで実行できます。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |