カーソルとロック
Microsoft SQL Server Compact 3.5 では、カーソル定義内の SELECT ステートメントに対し、他の SELECT ステートメントに適用されるのと同じトランザクション ロックのルールが適用されます。カーソル定義における SELECT ステートメントを含む、すべての SELECT ステートメントによって取得されるトランザクション ロックは、次のものによって制御されます。
接続に対するトランザクション分離レベルの設定
FROM 句で指定されるロック ヒント
トランザクション分離レベルはベース テーブルまたはインデックス カーソルに限り、取得されるロックに影響します。
重要
SQL Server Compact 3.5 の既定の分離レベルである READ COMMITTED では、データの位置決めや読み込みのときにロックを取得しません。READ COMMITTED のカーソルにとっては、カーソルが開いているときのスキーマの安定性を Sch-S ロックで確保することが必要です。データを変更する場合、排他ロックが掛けられます。
ロックは、カーソルと単独の SELECT ステートメントの現在のトランザクションがいずれも終了するまで解放されません。
ロックの取得
取得するトランザクション ロックの種類に関しては、カーソルも単独の SELECT ステートメントも同一のルールが適用されますが、ロックを取得するタイミングは異なります。単独の SELECT またはカーソルによって生成されるロックは、行が必要となるときに常に取得されます。単独の SELECT は、ステートメントの実行時にすべての行を取得します。カーソルは、種類によりさまざまな時点で行を取得します。
静的カーソルでは、カーソルを開くときに結果セット全体が取得されます。これにより、カーソルを開くときに結果セットの各行がロックされます。
キーセット ドリブン カーソルは、カーソルが開かれるときに結果セットの各行のキーを取得します。そのため、カーソルが開かれたときに結果セットの各行にロックが掛かります。
前方参照のみのカーソルはフェッチされるまで行を取得しません。行の位置が決まった時点でその行のロックを取得します。