FLOCK( )

Bloquea un fichero de base de datos abierto en modo compartido

Sintaxis

     FLOCK() –> lExito

Devuelve

FLOCK() devuelve verdadero (.T.) si el intento de bloquear un fichero de base de datos en uso en el área de trabajo actual es satisfactorio; de lo contrario, devuelve falso (.F.). Si desea obtener más información sobre el bloqueo de ficheros, consulte el capítulo Programación en Red en la guía Programación y Utilidades.

Descripción

FLOCK() es una función de base de datos que se utiliza en entornos de red para bloquear un fichero de base de datos abierto en modo compartido, evitando así que otros usuarios actualicen el fichero hasta que se libere el bloqueo. Los registros en el fichero bloqueado sólo están accesibles para operaciones de lectura.

FLOCK() se relaciona con USE…EXCLUSIVE y RLOCK(). USE…EXCLUSIVE abre un fichero de base de datos, de forma que ningún otro usuario pueda abrir el mismo fichero al mismo tiempo y se trata del mecanismo de bloqueo más restrictivo de DPXBASE. RLOCK() es el menos restrictivo e intenta situar un bloqueo de actualización en un registro compartido, impidiendo que otros usuarios actualicen el registro actual. FLOCK() representa un nivel de restricción medio.

FLOCK() se utiliza en operaciones que acceden a la totalidad del fichero de base de datos. Normalmente, estos son mandatos que actualizan el fichero con un ámbito o una condición, como por ejemplo, DELETE o REPLACE ALL. A continuación, se muestra una lista de estos mandatos:

     Mandatos que requieren FLOCK()

     ————————————————————————

     Mandato                       Modo

     ————————————————————————

     APPEND FROM                   FLOCK() o USE…EXCLUSIVE

     DELETE (varios registros)     FLOCK() o USE…EXCLUSIVE

     RECALL (varios registros)     FLOCK() o USE…EXCLUSIVE

     REPLACE (varios registros)    FLOCK() o USE…EXCLUSIVE

     UPDATE ON                     FLOCK() o USE…EXCLUSIVE

     ————————————————————————

Por cada llamada de FLOCK(), existe un intento de bloquear el fichero de base de datos y el resultado se devuelve como un valor lógico. Un bloqueo de fichero falla si otro usuario tiene actualmente un bloqueo de fichero o de registro para el mismo fichero de base de datos o bien, si otro usuario está usando la base de datos en modo exclusivo. Si FLOCK() es satisfactorio, el bloqueo de fichero permanece hasta que efectúe UNLOCK, CLOSE DATABASE o RLOCK().

Por defecto, FLOCK() funciona en el área de trabajo seleccionada, tal como se muestra en el ejemplo siguiente.

Notas

     ¦  SET RELATION: DPXBASE no bloquea automáticamente todas las áreas de trabajo en la cadena de relación cuando bloquea el área de trabajo actual y el uso de la función UNLOCK no es efectivo en áreas de trabajo relacionadas.

Ejemplos

     ¦  Este ejemplo utiliza FLOCK() para una actualización por lotes de los precios de Inventar.dbf:

        USE Inventar NEW

        IF FLOCK()

           REPLACE ALL Inventar->Precio WITH ;

                 Inventar->Precio * 1.1

        ELSE

           ? “Fichero no disponible”

        ENDIF

     ¦ Este ejemplo utiliza una expresión con alias para intentar un bloqueo de fichero en un área de trabajo no seleccionada:

        USE Ventas NEW

        USE Cliente NEW

        //

        IF !Ventas->(FLOCK())

           ? “Ventas está siendo usado por otro usuario”

        ENDIF

Ficheros:  La biblioteca asociada es DPXBASE.CH.