Compartir a través de


Administrar conflictos

Cuando elija el almacenamiento en búfer, transacciones o vistas, debe administrar los conflictos que puedan surgir durante el proceso de actualización.

Administrar conflictos en el almacenamiento en búfer

Puede hacer que las operaciones de actualización de datos sean más eficientes si elige cuidadosamente cómo y cuándo abrir, almacenar en búfer y bloquear datos en un entorno multiusuario. Deberá limitar el tiempo que un registro o una tabla están sometidos a conflictos de acceso. A pesar de todo, tendrá que anticiparse a los conflictos que se producen de forma inevitable y administrarlos. Un conflicto se produce cuando un usuario intenta bloquear un registro o una tabla que ya ha bloqueado otro usuario. Dos usuarios no pueden bloquear el mismo registro o la misma tabla a la vez.

La aplicación deberá contener una rutina para administrar estos conflictos. Si la aplicación no tiene una rutina de conflictos, el sistema puede quedar bloqueado. Se produce un interbloqueo cuando un usuario ha bloqueado un registro o una tabla e intenta bloquear otro registro ya bloqueado por un segundo usuario que, a su vez, está intentando bloquear el registro bloqueado por el primer usuario. Aunque esto no suele ocurrir, cuanto más tiempo permanezca bloqueado un registro o una tabla, mayores posibilidades habrá de que se produzca un interbloqueo.

Detectar errores

Diseñar una aplicación multiusuario o agregar soporte de red a un sistema de un solo usuario exige interceptar colisiones y errores. El uso de los búferes de registro y tabla de Visual FoxPro simplifica parte de este trabajo.

Si intenta bloquear un registro o una tabla que ya están bloqueados por otro usuario, Visual FoxPro devolverá un mensaje de error. Puede utilizar SET REPROCESS para resolver automáticamente los intentos fallidos de bloqueo. Este comando, en combinación con una rutina ON ERROR y el comando RETRY permite continuar o cancelar los intentos de bloqueo.

El ejemplo siguiente demuestra el reprocesamiento automático de una operación fallida mediante SET REPROCESS.

Ejemplo del uso de SET REPROCESS y ON ERROR para administrar colisiones de usuarios

Código Comentarios
ON ERROR DO err_fix WITH ERROR(),MESSAGE()
SET EXCLUSIVE OFF   
SET REPROCESS TO AUTOMATIC
USE customer
IF !FILE('cus_copy.dbf')
   COPY TO cus_copy
ENDIF
Esta rutina se ejecuta si se produce un error.
Abre los archivos de forma no exclusiva.
El reprocesamiento de bloqueos fallidos es automático.
Abra la tabla.

Si es necesario, crea la tabla APPEND FROM.
DO app_blank
DO rep_next
DO rep_all
DO rep_curr
DO add_recs
La rutina principal comienza aquí.
Estos comandos son ejemplos de los códigos que podrían ejecutarse en el curso del programa.
ON ERROR
La rutina principal termina aquí.
PROCEDURE app_blank      
   APPEND BLANK
RETURN
ENDPROC
Rutina que anexa un registro en blanco.
PROCEDURE rep_next
   REPLACE NEXT 1 contact WITH ;
      PROPER(contact)
RETURN
ENDPROC
Rutina que reemplaza los datos del registro actual.
PROCEDURE rep_all      
   REPLACE ALL contact WITH ;
      PROPER(contact)
   GO TOP
RETURN
ENDPROC
Rutina que reemplaza los datos de todos los registros.
PROCEDURE rep_curr      
   REPLACE contact WITH PROPER(contact)
RETURN
ENDPROC
Rutina que reemplaza los datos del registro actual.
PROCEDURE add_recs      
   APPEND FROM cus_copy
RETURN
ENDPROC
Rutina que anexa registros de otro archivo.

El ejemplo siguiente muestra un procedimiento de error que se inicia cuando el usuario presiona ESC.

Ejemplo de control de errores mediante la tecla ESC

Código Comentarios
PROCEDURE err_fix
   PARAMETERS errnum, msg
Este programa se activa cuando surge un error y el usuario sale del proceso de espera.
DO CASE
Averigua de qué tipo de error se trata.
¿Es "Otra persona está utilizando el archivo"?
   CASE errnum = 108      
      line1 = "File cannot be locked."
      line2 = "Try again later..."
 
   CASE errnum = 109 .OR. errnum = 130
      line1 = "Record cannot be locked."
      line2 = "Try again later."
¿O bien, "Otra persona está usando el registro"?
   OTHERWISE            
      line1 = msg + " "
      line2 = ;
         "See your system administrator."
ENDCASE
¿O es desconocido?


=MESSAGEBOX( line1 + line2, 48, "Error!" )
RETURN                  
Muestra el mensaje de error en un cuadro de diálogo con un signo de exclamación y un botón "Aceptar".

Vea también

Administrar actualizaciones mediante vistas | Detectar y resolver conflictos | Programar para acceso compartido | SET REPROCESS | ON ERROR | RETRY