La Web del Programador: Comunidad de Programadores
 
    Pregunta:  25786 - COMO USO FLOCK, RLOCK, UNLOCK
Autor:  JULIO CRUZ
quisiera saber como hacerle para utilizar los comandos de flock, rlock, unlock para evitar que fox me marque un error de concurrencia cuando dos personas o mas modifican o agregan un registro en una tabla al mismo tiempo (concurrencia) gracias de antemano

  Respuesta:  Julio Cesar Arango Cubillos
Para bloquear un registro, lo aconsejable es hacerlo inmediatamente antes de grabar; luego, inmediatamente despues de grabar se desbloquea. Aqui un pequeño ejemplo:

locate for NIT=890679001
If RLOCK()
replace NOMBRE with 'JUAN OROZCO', DIRECCION with 'SAN JUAN'
unlock
EndIf

  Respuesta:  Marvin Antonio Callejas Meléndez
La estrategia para evitar la concurrencia en tú sistema depende del diseño de bases de datos, el tiempo en que debes tener "protegida" contra lectura y/o escritura y a factores intrínsicos de su aplicación. Sin embargo las siguientes consideraciones pueden ayudarte.

a) Si necesitas generar un correlativo único cuando una gran cantidad de usuarios leen una misma tabla, utiliza el comando flock() esto garantiza que dos usuarios no tenga derechos de escritura y lectura (lo fundamental en este caso) simultáneamente, ej:
Si existe una tabla de correlativos, puedes utilizar el siguiente código:

if Flock("Tabla_correlativos")
micorr=Tabla_correlativos.numero+1 && Obtener correlativo
Replace Tabla_correlativos.numero with micorr && Actualizar
Unlock in "Tabla_correlativos"
else
***Mensaje de advertencia
***Rollback (Si es necesario)
endif

Visual Fox intenta bloquear la tabla hasta el número de segundos especificados por la instrucción SET REPROCESS TO <número de segundos>.
Es importante aclarar que este código debe estar en un método que se ejecuté lo más rápidamente (en guardar por ej.) para evitar que la tabla este mucho tiempo en lock. La anterior técnica garantiza la concurrencia y durabilidad de los datos.

b) Si únicamente lo que necesitas es bloquear una fila de una tabla para modificar pero que cualquier usuario pueda leerla, puedes utilizar RLOCK() que únicamente bloquea la fila especificada para escritura.

Si deseas información adicional puedes solicitarmela y describirme el objetivo de tu aplicación para así poderte ayudarte un poquito más.

Saludos desde El Salvador.