Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - SQL の使用法 » データベースの作成 » トランザクションと独立性レベルの使用

 

独立性レベルの選択

独立性レベルの選択は、アプリケーションが実行するタスクの種類によって異なります。この項では、選択のガイドラインを示します。

適切な独立性レベルを選択するには、一貫性と正当性のニーズと、同時に実行するトランザクションが妨げられずに処理を行うためのニーズのバランスを取る必要があります。トランザクションが 1 つのテーブルで 1 つまたは 2 つの特定の値しか使用しない場合は、数多くの大きなテーブルを検索したり、多くのローまたはテーブル全体をロックしたりするような、処理に非常に時間がかかるプロセスに比べると、トランザクションが妨げられる可能性はかなり少なくなります。

たとえば、トランザクションで銀行口座間の資金移動を行う場合、確実に正確な情報が返されるようにする必要があるでしょう。一方、休止中の口座の残高の概算を計算する場合は、そのトランザクションが他のトランザクションを待つかどうかを配慮しません。また、データベースの他のユーザを妨げないようにするために、多少の精度を犠牲にします。

さらに、金銭の振り込みは、2 つの口座の残高を含む 2 つのローだけに影響するのに対して、概算を計算するためにはすべての口座を読み込む必要があります。このため、金銭の振り込みによって他のトランザクションを遅らせる可能性は少なくなります。

SQL Anywhere では、0、1、2、3 の 4 つの独立性レベルがあります。レベル 3 は完全な独立性を提供し、トランザクションはスケジュールが直列化可能となる方法でインタリーブされます。

データベースでスナップショット・アイソレーションを有効にした場合は、さらに snapshot、statement-snapshot、readonly-statement-snapshot という 3 つの独立性レベルが利用可能になります。

スナップショット・アイソレーションのレベルの選択

スナップショット・アイソレーションには、同時実行性と一貫性の両方に利点があります。スナップショット・アイソレーションを使用すると、古いバージョンのローは実行中のトランザクションで必要とされる可能性があるかぎり保存されるため、コストがかかってしまいます。そのため、スナップショットを長期間実行すると、大量の古いロー・バージョンを格納する必要がある可能性があります。通常、statement-snapshot で使用されるスナップショットは、snapshot で使用されるスナップショットほど長くは存続しません。そのため、statement-snapshot の方が、snapshoto よりも一貫性は低くなりますが (トランザクション内の文ごとに、異なる時点のデータベースを認識する)、使用する領域の点で強みがあります。

スナップショット・アイソレーションを使用するうえでのパフォーマンス上の重要事項の詳細については、カーソルの感知性と独立性レベルを参照してください。

ほとんどの場合は、snapshot 独立性レベルをおすすめします。これにより、トランザクション全体のデータベースに関する単一ビューが表示されるためです。

statement-snapshot 独立性レベルを使用すると、データの一貫性は低くなりますが、トランザクションを長時間実行したためにバージョン情報を格納するテンポラリ・ファイルのサイズが大きくなりすぎる場合には有益です。

readonly-statement-snapshot 独立性レベルを使用すると、statement-snapshot よりも一貫性は低くなりますが、更新の競合が発生する可能性はなくなります。このため、この属性は元々異なる独立性レベルで実行することを想定していたアプリケーションを移植するのに最も適しています。

スナップショット・アイソレーションの詳細については、スナップショット・アイソレーションを参照してください。


直列化可能なスケジュール
各種独立性レベルでの典型的なトランザクション
独立性レベル 2 と 3 での同時実行性の改善
ロックの影響の削減