カーソルの使用

カーソルは大量のデータを扱う場合に便利ですが、カーソルを使用する際には、データ並行性、データ整合性、およびデータ一貫性に留意する必要があります。

データの一貫性を保証するために、データベース サーバーは異なるロック方法を実装することが可能です。データ アクセスの種類により、まったくロックが取得されない場合も、共有ロックが取得される場合も、排他ロックが取得される場合もあります。共有ロックでは、他のプロセスはデータにアクセスすることは可能ですが、更新はできません。また、排他ロックでは、他のプロセスはデータにまったくアクセスすることができません。

カーソルの使用には、3 つの分離レベルがあり、それらのレベルに従って、カーソルによる読み取りおよびロックが可能なデータが管理されます。

2 つのプロセスが同じデータで競合する状態「デッドロック」または「膠着状態」の問題が発生することがあります。古典的な例ですが、あるプロセスがデータ A をロックし、次にデータ B のロックを要求するとします。一方、別のプロセスはデータ B をロックし、データ A のロックを要求します。つまり、両方のプロセスが互いのプロセスが要求しているデータを持っていることになります。データベース サーバーは、このようなケースを発見した場合に、一方の、あるいは両方のプロセスに対してエラー メッセージを送る必要があります。

COBSQL

Oracle、Sybase、および Informix では、アプリケーションでカーソルの分離レベルを設定できます。適用可能なロック タイプおよび動作については、該当のドキュメントに記載されています。また、データがロックされる物理レベルについても説明されています。つまり、単一行、複数行 (ページ レベル)、テーブル全体など、それぞれのレベルのことです。複数の表、または多くのプロセスが使っている表を走査するカーソルを使用する場合には、ロックされたデータがアクセス効率の低下につながるため、その扱いには注意が必要となります。

注:

COBSQL

Oracle、Sybase、および Informix のシステムでは、多くの種類の句を使用してカーソルを定義することが可能です。たとえば、FOR READ ONLY、FOR UPDATE などです。これらの句を使用すると、カーソルの分離レベルやトランザクションのプロセスに巻き込まれた際の動作方法に影響がもたらされます。これらの各句の影響の詳細は、使用しているデータベースに付属の SQL リファレンス ブックを参照してください。