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