4D v16.3Record Locking |
||
|
4D v16.3
Record Locking
Record Locking
4D y 4D Server administran automáticamente las bases evitando conflictos entre procesos o entre usuarios. Dos usuarios o dos procesos no pueden modificar al mismo tiempo el mismo registro u el mismo objeto. El segundo usuario o proceso puede acceder simultáneamente al registro u objeto en modo sólo lectura. Hay muchas razones para utilizar los comandos multiusuario:
Hay tres conceptos importantes a tener en cuenta cuando se utilizan comandos en una base multiproceso:
En las siguientes secciones como convención, la persona que efectúa una operación en la base multiusuarios es el usuario local. Las otras personas que utilizan la base son los otros usuarios. La discusión es desde el punto de vista del usuario local. De la misma forma, desde el punto de vista multiproceso, el proceso que se ejecuta una operación en la base es el proceso actual. Todo otro proceso en curso de ejecución está diseñado como otro proceso. La discusión es desde el punto de vista del proceso actual. Un registro bloqueado no puede ser modificado por el usuario local o el proceso actual. Un registro bloqueado puede ser cargado, pero no modificado. Un registro se bloquea cuando uno de los otros usuarios o procesos carga el registro para efectuar una modificación o cuando el registro está apilado. Sólo el usuario que modifica el registro ve el registro como desbloqueado. Todos los otros usuarios y procesos ven el registro como bloqueado y por lo tanto no disponible para modificación. Una tabla debe estar en modo lectura/escritura para que un registro se cargue como desbloqueado. Cada tabla de una base está en modo lectura/escritura o en modo sólo lectura para cada usuario y proceso de la base. Sólo lectura significa que los registros de la tabla pueden ser cargados pero no modificados. Lectura/escritura significa que los registros de la tabla pueden ser cargados y modificados si ningún otro usuario/proceso ha bloqueado el registro previamente. Note que si cambia el estado de una tabla, el cambio toma efecto para el siguiente registro cargado. Si ya hay un registro cargado cuando cambia el estado de la tabla, el registro no se afecta por el cambio de estado.
Antes de ejecutar cualquiera de estos comandos, 4D guarda el estado actual de la tabla (sólo lectura o lectura/escritura) para el proceso actual. Después de ejecutar el comando, el estado inicial se restablece. Cuando una tabla está en lectura/escritura y se carga un registro, el registro estará desbloqueado si ningún otro usuario ha bloqueado el registro primero. Si el registro está bloqueado por otro usuario, el registro se carga como un registro bloqueado que no puede ser modificado por el usuario local. Si un usuario carga un registro de una tabla en modo lectura/escritura, ningún otro usuario puede cargar ese registro para modificación. Sin embargo, otros usuarios pueden añadir registros a la tabla, bien sea a través de los comandos CREATE RECORD o ADD RECORD o manualmente en el entorno Diseño. El modo lectura/escritura es el estado por defecto para todas las tablas cuando una base se abre y se inicia un nuevo proceso. Puede utilizar los comandos READ ONLY y READ WRITE para cambiar el estado de una tabla. Si quiere cambiar el estado de una tabla para volver un registro de sólo lectura o lectura/escritura, puede ejecutar el comando antes de cargar el registro. Todo registro ya cargado no se ve afectado por los comandos READ ONLY y READ WRITE. Cada proceso tiene su propio estado (sólo lectura o lectura/escritura) para cada tabla en la base. Por defecto, si no se utiliza el comando READ ONLY, todas las tablas están en modo lectura/escritura.Para que el usuario local pueda modificar un registro, la tabla debe estar en modo lectura/escritura y el registro debe cargarse y desbloquearse. Cada uno de los comandos que carga un registro actual (si hay uno), tales como NEXT RECORD, QUERY, ORDER BY, RELATE ONE, etc., define el estado bloqueado o desbloqueado del registro. El registro se carga en función del estado actual de su tabla (sólo lectura o lectura/escritura) y de su disponibilidad. Un registro también puede cargarse de una tabla relacionada por uno de los comandos que provoca una relación automática. Si una tabla está en modo lectura únicamente, para un proceso o usuario, todo registro de esta tabla se carga en modo lectura únicamente, lo que significa que no podrá ser modificado o eliminado por el proceso o usuario. Este modo se recomienda para la visualización o recuperación de datos, ya que no impide que otros usuarios o procesos accedan a los registros de esta tabla en modo lectura/escritura si es necesario. Si una tabla está en modo lectura/escritura, todo registro cargado de esta tabla está desbloqueado sólo si ningún otro usuario ha bloqueado el registro primero. Un registro desbloqueado puede ser modificado y guardado. Una tabla debe ser colocada en modo lectura/escritura antes de que un registro necesite ser cargado, modificado, y luego guardado. Si el registro debe modificarse, utilice la función Locked para probar si el registro está bloqueado por otro usuario. Si un registro está bloqueado (Locked devuelve True), cargue el registro con el comando [#cmd id="52"/] y pruebe nuevamente si el registro está bloqueado o no. Esta secuencia debe continuar hasta que el registro sea desbloqueado (Locked devuelve False).Cuando termine las modificaciones a un registro, el registro debe liberarse (y por lo tanto desbloquearse para los otros usuarios) con UNLOAD RECORD. Si no se descarga un registro, permanecerá bloqueado para todos los demás usuarios hasta que se seleccione un registro actual diferente. Cambiar el registro actual de una tabla desbloquea automáticamente el registro actual anterior. Debe llamar explícitamente UNLOAD RECORD si no cambia el registro actual. Este principio aplica a los registros existentes. Cuando se crea un nuevo registro, puede guardarse sin importar el estado de la tabla a la cual pertenece. Nota: cuando se utiliza en una transacción, el comando UNLOAD RECORD descarga el registro actual sólo para el proceso que administra la transacción. Para los otros procesos, el registro permanece bloqueado hasta que la transacción no sea validada (o cancelada). Utilice el comando LOCKED BY para ver que usuario y/o proceso tiene un registro bloqueado. Nota: una buena práctica es colocar todas las tablas en modo de sólo lectura cuando se inicia cada proceso (utilizando la sintaxis READ ONLY(*)) a continuación, se pone cada tabla en modo lectura/escritura sólo cuando sea necesario. El acceso a las tablas en modo de sólo lectura es más rápido y más económico en memoria. Por otra parte, cambiando el estado de una tabla se optimiza en modo cliente/servidor, ya que no causa ningún tráfico de red adicional: la información sólo se envía al servidor cuando se ejecuta un comando que requiere un acceso adecuado a la tabla. El siguiente ejemplo muestra el bucle más simple para cargar un registro no bloqueado: READ WRITE([Customers]) ` Define el estado de la tabla en lectura/escritura Un bucle como este se utiliza únicamente cuando es poco probable que el registro esté bloqueado por otra persona, ya que el usuario tendría que esperar hasta que el bucle termine. Este bucle no se utiliza a menos que el registro sólo sea modificable por un método. El siguiente ejemplo utiliza el bucle anterior para cargar un registro desbloqueado y modificar el registro: READ WRITE([Inventario]) El comando MODIFY RECORD notifica automáticamente al usuario si un registro está bloqueado y evita que el registro sea modificado. El siguiente ejemplo evita esta notificación automática probando el registro primero con la función Locked. Si el registro está bloqueado, el usuario puede cancelar. Este ejemplo prueba eficientemente si el registro actual está bloqueado para la tabla [Comandos]. Si está bloqueado, el proceso es retrasado por el método por un segundo. Esta técnica puede utilizarse en un desarrollo multiusuario o multiproceso: Repeat Ciertos comandos del lenguaje realizan acciones particulares cuando encuentran un registro bloqueado. Esta es la lista de estos comandos y sus acciones cuando encuentran un registro bloqueado.
Ver también
LOAD RECORD
|
PROPIEDADES
Producto: 4D
HISTORIA
ARTICLE USAGE
Manual de lenguaje 4D ( 4D v16) |