カーソルは大量のデータを扱う場合に便利ですが、カーソルを使用する際には、データ並行性、データ整合性、およびデータ一貫性に留意する必要があります。
データの一貫性を保証するために、データベース サーバーは異なるロック方法を実装することが可能です。データ アクセスの種類により、まったくロックが取得されない場合も、共有ロックが取得される場合も、排他ロックが取得される場合もあります。共有ロックでは、他のプロセスはデータにアクセスすることは可能ですが、更新はできません。また、排他ロックでは、他のプロセスはデータにまったくアクセスすることができません。
カーソルの使用には、3 つの分離レベルがあり、それらのレベルに従って、カーソルによる読み取りおよびロックが可能なデータが管理されます。
レベル 0 では、読み取り専用のカーソルのみが使用可能です。レベル 0 では、カーソル行をロックすることはありませんが、コミットされていないデータを読み取ることは可能です。ただし、コミットされていないデータを読み取るのは危険です (ロールバック操作によって、データが元の状態にリセットされてしまう可能性があるため)。通常、この操作は「ダーティ リード」と呼ばれます。すべてのデータベースがダーティ リードを許可しているわけではありません。
レベル 1 では、読み取り専用、または更新可能カーソルが使用可能です。レベル 1 の場合、FOR UPDATE 句を使用しない限り、データには共有ロックが適用されます。FOR UPDATE 句を使用する場合は、排他ロックがデータに適用されます。カーソルをクローズすると、ロックが解除されます。通常、FOR UPDATE 句なしの標準カーソルは、分離レベル 1 にあり、共有ロックを使用します。
レベル 3 のカーソルはトランザクションで使用されます。カーソルをクローズする際ではなく、トランザクションの終了時にロックが解除されます。レベル 3 では、通常、排他ロックがデータに適用されます。
2 つのプロセスが同じデータで競合する状態「デッドロック」または「膠着状態」の問題が発生することがあります。古典的な例ですが、あるプロセスがデータ A をロックし、次にデータ B のロックを要求するとします。一方、別のプロセスはデータ B をロックし、データ A のロックを要求します。つまり、両方のプロセスが互いのプロセスが要求しているデータを持っていることになります。データベース サーバーは、このようなケースを発見した場合に、一方の、あるいは両方のプロセスに対してエラー メッセージを送る必要があります。
COBSQL
Oracle、Sybase、および Informix では、アプリケーションでカーソルの分離レベルを設定できます。適用可能なロック タイプおよび動作については、該当のドキュメントに記載されています。また、データがロックされる物理レベルについても説明されています。つまり、単一行、複数行 (ページ レベル)、テーブル全体など、それぞれのレベルのことです。複数の表、または多くのプロセスが使っている表を走査するカーソルを使用する場合には、ロックされたデータがアクセス効率の低下につながるため、その扱いには注意が必要となります。