Cursores y bloqueo
En Microsoft SQL Server Compact 4.0, la instrucción SELECT de una definición de cursor se somete a las mismas reglas de bloqueo de transacciones que se aplican a las demás instrucciones SELECT. Los bloqueos de transacciones adquiridos por cualquier instrucción SELECT, incluida la instrucción SELECT en una definición de cursor, se controlan mediante:
La configuración de nivel de aislamiento de transacción para la conexión.
Cualquier sugerencia de bloqueo especificada en la cláusula FROM.
En el caso de los cursores de índice o las tablas base, el nivel de aislamiento de transacción puede afectar a los bloqueos que se adquieran.
Importante
Para el nivel de aislamiento predeterminado de lectura confirmada (READ COMMITTED), SQL Server Compact 4.0 no adquiere bloqueos al colocar y leer datos. Los cursores en READ COMMITTED precisan un bloqueo Sch-S para proteger la estabilidad del esquema mientras el cursor esté abierto. Se adoptan bloqueos exclusivos si se cambian los datos.
Los bloqueos se mantienen hasta el final de la transacción actual tanto para cursores como para instrucciones SELECT independientes.
Adquirir bloqueos
Aunque los cursores siguen las mismas reglas que las instrucciones SELECT independientes en lo que respecta al tipo de bloqueos de transacciones adquiridos, estos se adquieren en momentos diferentes. Los bloqueos generados por una instrucción SELECT independiente o un cursor se adquieren siempre cuando se necesita una fila. En el caso de una instrucción SELECT independiente, todas las filas se recuperan cuando se ejecuta la instrucción. Los cursores recuperan las filas en momentos diferentes dependiendo del tipo de cursor:
Los cursores estáticos recuperan el conjunto de resultados completo cuando se abre el cursor. De esta manera, todas las filas del conjunto de resultados se bloquean en el momento de apertura.
Los cursores controlados por conjunto de claves recuperan las claves de cada fila del conjunto de resultados cuando se abre el cursor. De esta manera, todas las filas del conjunto de resultados se bloquean en el momento de apertura.
Los cursores de solo avance no recuperan filas hasta que se capturan. No se adquieren bloqueos para las filas hasta que se han colocado en ellas.