Compartir a través de


LOCK( ) (Función)

Intenta bloquear uno o varios registros de una tabla.

LOCK([nWorkArea | cTableAlias]|
 [cRecordNumberList, nWorkArea | cTableAlias])

Valores devueltos

Logical

Parámetros

  • nWorkArea | cTableAlias
    Intenta bloquear el registro activo de una tabla abierta en un área de trabajo específica. nWorkArea especifica el número del área de trabajo y cTableAlias especifica el alias de la tabla. Si no especifica ningún área de trabajo ni alias de tabla, LOCK( ) intentará bloquear el registro activo de la tabla del área de trabajo actual.

  • cRecordNumberList
    Especifica una lista de uno o varios números de registro que es necesario incluir para intentar bloquear múltiples registros. SET MULTILOCKS debe estar ON y se deben incluir el área de trabajo o el alias de la tabla en la que se está intentando introducir múltiples bloqueos de registros.

    LOCK( ) intenta bloquear todos los registros especificados. Los números de registro especificados mediante cRecordNumberList se separan por comas. Por ejemplo, para intentar bloquear los cuatro primeros registros de una tabla, cRecordNumberList debe contener 1,2,3,4.

    También puede bloquear varios registros moviendo el puntero de registro al registro que quiere bloquear, ejecutando LOCK( ) o RLOCK( ) y repitiendo luego estos pasos para cada registro adicional.

    En Visual FoxPro, puede especificar 0 como número de registro. Al especificar 0, el sistema le permite intentar bloquear el encabezado de la tabla.

    Nota   Debe mantener bloqueado el encabezado de la tabla el menor tiempo posible, ya que los demás usuarios no pueden agregar registros a la tabla cuando el encabezado está bloqueado.

    Libere el bloqueo del encabezado de la tabla con UNLOCK RECORD 0, UNLOCK o UNLOCK ALL.

    Si todos los registros especificados en cRecordNumbers se bloquean con éxito, LOCK( ) devolverá verdadero (.T.). Si alguno de los registros especificados con cRecordNumbers no se puede bloquear, aunque sea uno solo, LOCK( ) devolverá falso (.F.) y ninguno de los registros se bloqueará. No obstante, los bloqueos existentes en los registros permanecerán. El bloqueo de múltiples registros es un proceso aditivo. Agregar bloqueos de registros adicionales no libera los bloqueos de otros registros.

    El número máximo de registros que pueden estar bloqueados en cada área de trabajo es aproximadamente 8.000. Siempre es más rápido bloquear toda la tabla en lugar de varios registros, aunque sean pocos.

Observaciones

La función LOCK( ) es idéntica a RLOCK( ).

Si los bloqueos se sitúan correctamente, LOCK( ) devolverá verdadero (.T.). Los registros bloqueados están disponibles tanto para acceso de lectura como de escritura para el usuario que efectúa los bloqueos; estarán disponibles únicamente con acceso de lectura para todos los demás usuarios de la red.

La ejecución de LOCK( ) no garantiza que se vayan a efectuar con éxito el bloqueo o los bloqueos de registros. No puede efectuarse un bloqueo de registro sobre un registro que ya esté bloqueado por otro usuario o en una tabla bloqueada por otro usuario. Si el bloqueo o los bloqueos de registro no logran efectuarse por alguna razón, LOCK( ) devolverá el valor falso (.F.).

De forma predeterminada, LOCK( ) sólo intenta una vez el bloqueo de un registro. Utilice SET REPROCESS para reintentar automáticamente un bloqueo de registro si el primer intento no tiene éxito. SET REPROCESS determina el número de intentos de bloqueo o durante cuánto tiempo se intentará bloquear cuando fracase el intento inicial. Para obtener más información, vea SET REPROCESS.

SET MULTILOCKS determina si puede bloquear varios registros de una tabla. Si SET MULTILOCKS está OFF (valor predeterminado), sólo podrá bloquear un registro de una tabla. Cuando SET MULTILOCKS está ON, podrá bloquear múltiples registros de una tabla. Para obtener más información, vea SET MULTILOCKS.

Desbloqueo de registros   Un registro de una tabla sólo puede desbloquearlo el usuario que efectuó el bloqueo. Puede liberar bloqueos de registro ejecutando UNLOCK, cerrando la tabla o saliendo de Visual FoxPro.

UNLOCK puede utilizarse para liberar bloqueos de registro del área de trabajo actual, un área de trabajo concreta o todas las áreas de trabajo. Para obtener más información, vea UNLOCK.

Alternando MULTILOCKS de ON a OFF o de OFF a ON se realiza UNLOCK ALL de forma implícita: se liberan todos los bloqueos de registro de todas las áreas de trabajo.

Las tablas pueden cerrarse con USE, CLEAR ALL o CLOSE DATABASES.

Para obtener más información acerca del bloqueo de registros y archivos, así como del uso compartido de tablas en una red, vea Programar para acceso compartido.

Ejemplo

El ejemplo siguiente bloquea y desbloquea los cuatro primeros registros de las tablas customer y employee.

CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SET REPROCESS TO 3 AUTOMATIC
STORE '1,2,3,4' TO gcRecList
gcOldExc = SET('EXCLUSIVE')
SET EXCLUSIVE OFF
SELECT 0
USE employee  && Open Employee table
SELECT 0
USE customer  && Open Customer table
? LOCK('1,2,3,4', 'customer')  && Lock 1st 4 records in customer
? RLOCK(gcRecList, 'employee')  && Lock 1st 4 records in employee
UNLOCK IN customer
UNLOCK IN employee
SET EXCLUSIVE &gcOldExc

Vea también

CLEAR | CLOSE | FLOCK( ) | RLOCK( ) | SET MULTILOCKS | SET REPROCESS | UNLOCK | USE