Freigeben über


Konfliktverwaltung

Ob Sie sich beim Aktualisieren nun für die Zwischenspeicherung, für Transaktionen oder für Ansichten entscheiden, Sie müssen bei Konflikten im Aktualisierungsprozess handlungsfähig sein.

Konflikte bei der Zwischenspeicherung

Sie können die Effizienz von Datenaktualisierungsoperationen erhöhen, indem Sie sorgfältig entscheiden, wie und wann Datenbestände in einer Mehrbenutzerumgebung geöffnet, zwischengespeichert und gesperrt werden. Sie sollten in jedem Fall die Zeit beschränken, für die ein Datensatz oder eine Tabelle zum Gegenstand von Zugriffskonflikten werden kann. Trotzdem müssen Sie die in einer Mehrbenutzerumgebung unvermeidlichen Konflikte voraussehen und Vorkehrungen treffen. Ein Konflikt tritt auf, wenn ein Benutzer versucht, einen Datensatz oder eine Tabelle zu sperren, der bzw. die zur Zeit von einem anderen Benutzer gesperrt ist. Zwei Benutzer können nicht denselben Datensatz oder dieselbe Tabelle gleichzeitig sperren.

Ihre Anwendung sollte also über eine Routine verfügen, mit der derartige Konflikte gelöst werden können. Falls die Anwendung nicht über eine solche Konfliktroutine verfügt, kann es sein, dass das System gesperrt wird. Eine Blockierung (Deadlock) tritt auf, wenn ein Benutzer einen Datensatz oder eine Tabelle gesperrt hat und versucht, einen weiteren Datensatz zu sperren, der aber von einem zweiten Benutzer gesperrt wurde, der wiederum versucht, den Datensatz zu sperren, der vom ersten Benutzer bereits gesperrt wurde. Diese Situation tritt zwar selten auf, doch je länger ein Datensatz oder eine Tabelle gesperrt ist, desto größer ist die Wahrscheinlichkeit einer Blockierung.

Abfangen von Fehlern

Für den Entwurf einer Mehrbenutzeranwendung oder beim Hinzufügen von Netzwerkfähigkeit zu einem Einzelbenutzersystem ist es erforderlich, dass Sie sich mit derartigen Kollisionen auseinander setzen und mögliche Fehler abfangen. Ein Teil dieser Arbeit wird durch die Verwendung der Visual FoxPro-Datensatz- und Tabellenpufferung vereinfacht.

Wenn Sie versuchen, einen Datensatz oder eine Tabelle zu sperren, die bereits von einem anderen Benutzer gesperrt wurde, gibt Visual FoxPro eine Fehlermeldung zurück. Sie können nun SET REPROCESS verwenden, um derartige erfolglose Sperrversuche automatisch bearbeiten zu lassen. Dieser Befehl, in Kombination mit einer ON ERROR-Routine und dem RETRY-Befehl, ermöglicht es Ihnen, mit dem Sperrversuch fortzufahren oder diesen abzubrechen.

Im folgenden Beispiel wird die automatische Wiederverarbeitung einer fehlgeschlagenen Operation mit Hilfe des SET REPROCESS-Befehls dargestellt.

Verwenden von SET REPROCESS und ON ERROR zur Bearbeitung von Benutzerkonflikten

Code Kommentar
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
Diese Routine wird ausgeführt, wenn ein Fehler auftritt.
Öffnet die Dateien nicht-exklusiv.
Die Wiederverarbeitung eines erfolglosen Sperrversuchs erfolgt automatisch.
Öffnen Sie die Tabelle.

Erstellt erforderlichenfalls die Tabelle APPEND FROM.
DO app_blank
DO rep_next
DO rep_all
DO rep_curr
DO add_recs
Start der Hauptroutine.
Diese Befehle sind Beispiele für Code, der im Verlauf Ihres Programms ausgeführt werden könnte.
ON ERROR
Ende der Hauptroutine.
PROCEDURE app_blank      
   APPEND BLANK
RETURN
ENDPROC
Routine zum Anhängen eines leeren Datensatzes.
PROCEDURE rep_next
   REPLACE NEXT 1 contact WITH ;
      PROPER(contact)
RETURN
ENDPROC
Routine zum Ersetzen von Daten im aktuellen Datensatz.
PROCEDURE rep_all      
   REPLACE ALL contact WITH ;
      PROPER(contact)
   GO TOP
RETURN
ENDPROC
Routine zum Ersetzen von Daten in allen Datensätzen.
PROCEDURE rep_curr      
   REPLACE contact WITH PROPER(contact)
RETURN
ENDPROC
Routine zum Ersetzen von Daten im aktuellen Datensatz.
PROCEDURE add_recs      
   APPEND FROM cus_copy
RETURN
ENDPROC
Routine zum Anhängen von Datensätzen aus einer anderen Datei.

Das folgende Beispiel enthält eine Fehlerprozedur, die gestartet wird, wenn der Benutzer ESC drückt.

Fehlerbehandlung unter Verwendung von ESC

Code Kommentar
PROCEDURE err_fix
   PARAMETERS errnum, msg
Dieses Programm wird aufgerufen, wenn ein Fehler auftritt und der Benutzer den Warteprozess durch Drücken von ESC beendet.
DO CASE
Ermittelt, was für eine Art Fehler aufgetreten ist.
Handelt es sich um den Fehler "Datei wird von einer anderen Person verwendet"?
   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."
Oder handelt es sich um den Fehler "Datensatz wird von einer anderen Person verwendet"?
   OTHERWISE            
      line1 = msg + " "
      line2 = ;
         "See your system administrator."
ENDCASE
Oder ist es ein unbekannter Fehler?


=MESSAGEBOX( line1 + line2, 48, "Error!" )
RETURN                  
Zeigt eine Fehlermeldung in einem Dialogfeld mit Ausrufungszeichen und der Schaltfläche OK an.

Siehe auch

Verwaltung von Updates mit Sichten | Ermitteln und Lösen von Konflikten | Programmieren für freigegebenen Zugriff | SET REPROCESS | ON ERROR | RETRY