Visual Foxpro : LOCK(), RLOCK(), SET MULTILOCKS
Estas funciones y comandos permiten bloquear y desbloquear uno o más registros. Sólo bloqueando un registro la aplicación puede estar segura de que está viendo los datos reales en el disco. MULTILOCKS permite bloquear más de un registro en una tabla a la vez; esto es esencial para el almacenamiento en búfer de la tabla. Con la introducción del almacenamiento en búfer en Visual FoxPro, el bloqueo explícito de registros se necesita con mucha menos frecuencia.
LOCK()
y RLOCK()
son exactamente iguales. RLOCK()
significa Record Lock, para diferenciarlo de FLOCK()
, la función File Lock. La función LOCK()
se heredó de otro dialecto de Xbase, pero funciona exactamente igual que RLOCK()
.
RLOCK()
bloquea un registro y lo marca como disponible para actualización únicamente en esta estación de trabajo. Otras estaciones de trabajo pueden ver el registro o mostrar los valores del registro en informes, pero no pueden cambiar el registro. Un bloqueo de registro fallará si otra estación de trabajo ya bloqueó ese registro o bloqueó el archivo.
Bloquear el encabezado de la tabla
SELECT clientes
LOCK("0","clientes")
SELECT MAX(codcli) as maxcod FROM clientes INTO CURSOR temporal
vsigcod=temporal.maxcod+1
USE IN temporal
SELECT clientes
UNLOCK RECORD 0
Al especificar el número de registro 0 (cero), se bloquea el encabezado de la tabla sin bloquear ningún registro individual. Nunca hemos hecho esto y no estamos seguros de por qué sería preferible a un archivo FLOCK()
.
Bloquear el encabezado de la tabla evita que otros usuarios agreguen registros, porque la cantidad de registros se almacena en el encabezado, pero permite bloqueos de registros individuales en registros existentes. Entonces, ¿por qué querrías hacer esto? Uno de los pocos escenarios que podemos imaginar es si desea ejecutar un informe fuera de la tabla y no desea que se agreguen registros en el medio del informe para alterar el recuento o los totales.
Al CONFIGURAR BLOQUEO EN ON, puede leer los valores actuales de los registros bloqueados individualmente y obtener el informe más preciso sobre el estado de la tabla con el menor inconveniente para otros usuarios de la red. Sin embargo, si elige este método, tenga en cuenta que su técnica para agregar registros debe poder manejar con elegancia la posibilidad de que no siempre se puedan agregar registros a una tabla. SYS(2011) informa que la condición es "Encabezado bloqueado".
La Función FLOCK
La función flock() lo que hace es bloquear el archivo mientras graba, y luego con el unlock lo desbloquea para que otro usuario utilice el archivo para grabar.
do while !flock() es igual a: do while .not. flock() que quiere decir: haga mientras NO esté bloqueado, está en un do while por que si está bloqueado por que alguien está grabando se queda ahi esperando (y NO sale el mensaje de que "Otro usuario lo está usando") hasta que el otro usuario grabe y lo desbloquee con unlock, en ese momento el usuario que estaba esperando bloquea el archivo, graba y lo desbloquea con unlock para darle permiso a otro usuario.
Saber si se a bloqueado
ISRLOCKED( ) devuelve un valor lógico Verdadero (.T.) si el registro está bloqueado; de lo contrario devuelve un valor lógico Falso (.F.).
ISFLOCKED( ) devuelve un valor lógico verdadero (.T.) si la tabla está bloqueada; de lo contrario, devolverá un valor lógico falso (.F.). ISFLOCKED( ) es similar a SYS(2011), pero devuelve un valor lógico que no necesita localización en el caso de aplicaciones internacionales.
Ejemplos
Ejemplo 1
? RLOCK() && bloquear el registro actual de la tabla actual
? RLOCK("clientes") && bloquear el registro actual de la tabla de clientes
? RLOCK("65", "clientes") && bloquear el registro 65 de la tabla de clientes
? RLOCK("1,2,3", "clientes") && bloquear registros 1,2,3 de la tabla de clientes
Ejemplo 2
sele mitabla
appen blank
if rlock()
replace next 1 fecha with m.fecha
unlock
endif
el append blank casi te garantiza problemas en la red, si tenes clave primaria no autoincremental, y varios intentan agregar registros a la vez, lo mas probable que algunos les de clave duplicada.
Lo aconsejable es usar insert into, disponible aun en fox dos
Referencia
https://hackfox.github.io/section4/s4g204.html
https://groups.google.com/g/vfplatino/c/zpticwqtReg