Share via


Bloquear datos

Si comparte el acceso a los archivos, también deberá administrar el acceso a los datos bloqueando tablas y registros. Los bloqueos, a diferencia de los permisos de acceso, pueden proporcionar un control de los datos a largo y a corto plazo. Visual FoxPro proporciona tanto bloqueo automático como manual.

Elegir bloqueos de registro o de tabla

El bloqueo de registro, tanto si es automático como si es manual, impide que un usuario escriba en un registro en el que está escribiendo otro usuario. El bloqueo de tabla impide que otros usuarios escriban en la tabla, aunque pueden leerla. Puesto que el bloqueo de tabla prohíbe a otros usuarios actualizar los registros de una tabla, deberá hacer un uso comedido de esta característica.

Elegir entre bloqueo automático y manual

Además del bloqueo de registro o de tabla, también puede elegir entre bloqueo automático y manual. Muchos comandos de Visual FoxPro intentan bloquear automáticamente un registro o una tabla antes de que se ejecute el comando. Si el registro o la tabla están bloqueados correctamente, el comando se ejecutará y se liberará el bloqueo.

Comandos que bloquean automáticamente registros y tablas

(Comando) Alcance del bloqueo
ALTER TABLE Toda la tabla
APPEND Encabezado de la tabla
APPEND BLANK Encabezado de la tabla
APPEND FROM Encabezado de la tabla
APPEND FROM ARRAY Encabezado de la tabla
APPEND MEMO Registro activo
BLANK Registro activo
BROWSE, CHANGE y EDIT Registro actual y todos los registros de campos con alias de tablas relacionadas cuando comienza la edición de un campo
CURSORSETPROP( ) Depende de los parámetros
DELETE Registro activo
DELETE NEXT 1 Registro activo
DELETE RECORD n Registro n
DELETE de más de un registro Toda la tabla
DELETE – SQL Registro activo
GATHER Registro activo
INSERT Toda la tabla
INSERT - SQL Encabezado de la tabla
MODIFY MEMO Registro actual cuando comienza la edición
READ Registro actual y todos los registros de campos con alias
RECALL Registro activo
RECALL NEXT 1 Registro activo
RECALL RECORD n Registro n
RECALL de más de un registro Toda la tabla
REPLACE Registro actual y todos los registros de campos con alias
REPLACE NEXT 1 Registro actual y todos los registros de campos con alias
REPLACE RECORD n Registro n y todos los registros de campos con alias
REPLACE de más de un registro Toda la tabla y todos los archivos de campos con alias
SHOW GETS Registro actual y todos los registros de campos con alias
TABLEUPDATE( ) Depende del almacenamiento en búfer
UPDATE Toda la tabla
UPDATE – SQL Toda la tabla

Características del bloqueo de registros

Los comandos que intentan bloquear registros son menos restrictivos que los comandos que bloquean tablas. Si bloquea un registro, los demás usuarios podrán seguir agregando o eliminando otros registros. Si otro usuario ya ha bloqueado un registro o una tabla, no se podrá bloquear dicha tabla o registro. Los comandos que intentan bloquear el registro actual devuelven el error "Otra persona está usando el registro" si no es posible bloquear el registro.

Los comandos BROWSE, CHANGE, EDIT y MODIFY MEMO no bloquean un registro hasta que lo modifique. Si está modificando campos procedentes de registros de tablas relacionadas, los registros relacionados se bloquearán si es posible. El intento de bloqueo producirá errores si el registro actual o alguno de los registros relacionados está bloqueado por otro usuario. Si se consigue realizar el bloqueo, podrá modificar el registro; el bloqueo se liberará cuando usted vaya a otro registro o active otra ventana.

Características del bloqueo de tablas y encabezados

Algunos comandos de Visual FoxPro bloquean toda una tabla mientras que otros sólo bloquean su encabezado. Los comandos que bloquean la tabla completa interfieren en ella en mayor grado que los comandos que sólo bloquean el encabezado de la tabla. Cuando bloquee el encabezado de la tabla, otros usuarios no podrán agregar registros, aunque sí podrán cambiar los datos de los campos.

Los usuarios pueden compartir la tabla sin ocasionar conflictos cuando se ejecuta el comando APPEND BLANK pero puede producirse un error cuando otro usuario también anexa un registro BLANK a la tabla. Puede interceptar el error "Otra persona está utilizando el archivo", que se devuelve cuando dos o más usuarios ejecutan APPEND BLANK simultáneamente. Los comandos que bloquean toda la tabla devuelven el error "Otra persona está utilizando el archivo" si la tabla no puede bloquearse. Para cancelar el intento de bloqueo, presione ESC.

Ejemplo: bloqueo automático

En el ejemplo siguiente, el usuario bloquea automáticamente el encabezado de la tabla; para ello, anexa registros de otra tabla, aunque customer se haya abierto como un archivo compartido.

SET EXCLUSIVE OFF
USE customer
APPEND FROM oldcust FOR status = "OPEN"

Bloqueo manual

Puede bloquear manualmente un registro o una tabla mediante las funciones de bloqueo.

Para bloquear manualmente un registro o una tabla

  • Utilice uno de estos comandos:

    RLOCK()
    LOCK()
    FLOCK()
    

RLOCK( ) y LOCK( ) son idénticos y bloquean uno o más registros. FLOCK( ) bloquea un archivo. Las funciones LOCK( ) y RLOCK( ) pueden aplicarse a un encabezado de tabla. Si especifica 0 como el registro para LOCK( ) o RLOCK( ) y la prueba indica que el encabezado está desbloqueado, la función bloqueará el encabezado y devolverá True (.T.).

Una vez bloqueado un registro o una tabla, asegúrese de liberar el bloqueo mediante el comando UNLOCK lo antes posible para proporcionar acceso a otros usuarios.

Estas funciones de bloqueo manual realizan las siguientes acciones:

  • Comprueban el estado de bloqueo del registro o la tabla.

  • Si la prueba indica que el registro está desbloqueado, bloquean el registro o la tabla y devuelven True (.T.).

  • Si no se puede bloquear el registro o la tabla, vuelven a intentarlo, dependiendo del valor actual de SET REPROCESS.

  • Devuelven True (.T.) o False (.F.), indicando si el intento de bloqueo ha tenido éxito o no.

    Sugerencia   Si desea comprobar el estado de bloqueo de un registro en la sesión sin bloquear el registro, use la función ISRLOCKED( ) o ISFLOCKED( ).

Si falla el intento de bloquear un registro o una tabla, el comando SET REPROCESS y la rutina de error actual determinarán si vuelve a intentarse el bloqueo. SET REPROCESS afecta al resultado de un intento de bloqueo sin éxito. Puede controlar el número de intentos de bloqueo o el período de tiempo durante el cual se intenta un bloqueo mediante SET REPROCESS.

Ejemplo: bloqueo manual

El ejemplo siguiente abre la tabla customer para acceso compartido y utiliza FLOCK( ) para intentar bloquearla. Si la tabla se bloquea con éxito, REPLACE ALL actualizará todos sus registros. UNLOCK libera el bloqueo de archivo. Si el archivo no puede bloquearse porque otro usuario haya bloqueado el archivo o uno de sus registros, se mostrará un mensaje.

SET EXCLUSIVE OFF
SET REPROCESS TO 0
USE customer    && Open table shared
IF FLOCK()
 REPLACE ALL contact ;    && Replace and unlock
  WITH UPPER(contact) 
 UNLOCK   
ELSE  && Output message
 WAIT "File in use by another." WINDOW NOWAIT
ENDIF

Desbloquear datos

Después de establecer un bloqueo de registro o de archivo y completar una operación de datos en un entorno compartido, deberá liberar el bloqueo lo antes posible. Hay varios modos de liberar los bloqueos. En algunos casos, basta con desplazarse al registro siguiente para desbloquear los datos. En otros casos es preciso ejecutar comandos explícitos.

Para desbloquear un registro que se ha bloqueado automáticamente, sólo necesitará mover el puntero de registro, aunque haya establecido MULTILOCKS ON. No obstante, deberá eliminar explícitamente el bloqueo de un registro que haya bloqueado manualmente; mover el puntero de registro no es suficiente.

En la tabla siguiente se describen los efectos que producen diversos comandos sobre el bloqueo manual y automático de registros y tablas.

(Comando) Efecto
UNLOCK Libera los bloqueos de registro y archivo en el área de trabajo actual.
UNLOCK ALL Libera todos los bloqueos de todas las áreas de trabajo de la sesión actual.
SET MULTILOCKS OFF Activa la liberación automática del bloqueo actual al asegurar un bloqueo nuevo.
FLOCK( ) Libera todos los bloqueos de registro del archivo afectado antes de bloquear el archivo.
CLEAR ALL, CLOSE ALL,
USE, QUIT
Libera todos los bloqueos de registro y archivo.
END TRANSACTION Libera los bloqueos automáticos.
TABLEUPDATE( ) Libera todos los bloqueos antes de actualizar la tabla.

Precaución   Si se ha bloqueado automáticamente un registro en una función definida por el usuario y se desplaza el puntero fuera del registro y se vuelve a colocar sobre él, el bloqueo se liberará. Utilice el almacenamiento de tablas en búfer para evitar este problema.

Vea también

Controlar el acceso a datos | Usar sesiones de datos | Programar para acceso compartido | RLOCK( ) | LOCK( ) | FLOCK( ) | UNLOCK