<< | Inhaltsverzeichnis | Suchen | >> |
Im Mehrplatzbetrieb muß sichergestellt werden, daß beim Zugriff auf gemeinsam benutzte Daten die Konsistenz der Daten gewährleistet bleibt. Dies wird durch Satz- und Datei-Sperren (Record- und File-Locking) erreicht. Beim Generieren eines Programms muß für jede Indexdatei die Zugriffsart (Open) angegeben werden. Durch die Zugriffsart wird festgelegt, ob und in welcher Weise Dateien und Datensätze gesperrt werden. Folgende Zugriffsarten sind möglich:
S (Single-User) |
Beim Zugriff auf die Indexdatei werden keine Datensätze gesperrt. Deshalb darf diese Zugriffsart nur bei Programmen gewählt werden, die im Einplatz-Betrieb (MS-DOS) ablaufen. Zur Beschleunigung der Dateizugriffe werden im Programm die gelesenen Indexknoten gepuffert. Die Größe des programminternen Pufferspeichers kann über die Anweisung BUFFERS gesteuert werden. |
M (Multi-User Shared) |
Diese Zugriffsart ist für den Mehrplatzbetrieb vorgesehen, wo mehrere Programme gleichzeitig auf die Indexdatei zugreifen (Netzwerk, UNIX). Standardmäßig wird jeder gelesene Datensatz nach dem Lesen sofort wieder freigegeben (NOHOLDLOCK). Bei HOLDLOCK bleibt der Datensatz solange für andere Zugreifer gesperrt, bis der Datensatz entweder zurückgeschrieben (WRITE) oder ein anderer Datensatz aus der Indexdatei gelesen wird. |
R
(Multi-User Read-only) |
Diese Zugriffsart ist im Mehrplatzbetrieb für Indexdateien vorgesehen, auf die im Programm nur lesend zugegriffen wird. Alle gelesenen Datensätze werden nur für die Zeit des Lesens gesperrt (damit die Daten konsistent gelesen werden können) und dann sofort wieder freigegeben. Im Gegensatz zur Zugriffsart M ist der zuletzt gelesene Datensatz nicht gesperrt. Dadurch werden die Datensätze für andere Programme nicht blockiert. |
E (Multi-User exklusiv) |
Die Indexdatei wird im Mehrplatzbetrieb exklusiv geöffnet. D.h. die Indexdatei kann nur geöffnet werden, falls kein anderes Programm die Datei eröffnet hat. Wenn eine Indexdatei nicht exklusiv geöffnet werden kann, wird das Programm mit Fehlermeldung beendet. Während die Indexdatei exklusiv geöffnet ist, kann kein anderes Programm gestartet werden, das diese Indexdatei benutzt. Dabei ist es gleichgültig, mit welcher Zugriffsart auf die Indexdatei zugegriffen werden soll. Bei exklusivem Zugriff laufen im Gegensatz zu den Zugriffsarten M und R die Indexdateizugriffe schneller ab, da im Programm die gelesenen Indexknoten gepuffert werden. Die Größe des programminternen Pufferspeichers kann über die Anweisung BUFFERS gesteuert werden. |
Im Mehrplatzbetrieb werden Verklemmungen (Deadlocks) automatisch erkannt und durch eine entsprechende Systemfehlermeldung gemeldet.
In der Programmiersprache stehen Anweisungen für die individuelle Steuerung des Record-Locking bei Zugriffsart M zur Verfügung:
Datensätze können generell nur dadurch gesperrt werden, daß sie gelesen werden. Bei Zugriffsart M wird bei HOLDLOCK immer der zuletzt gelesene Datensatz der Indexdatei gesperrt. Mit WRITE geschriebene Sätze werden nach dem Schreiben wieder freigegeben (unlock), falls nicht die Anweisung NOUNLOCK für die Indexdatei gültig ist. Die Anweisung NOUNLOCK <INDEXDATEI> führt dazu, daß alle gelesenen und geschriebenen Datensätze solange gesperrt bleiben, bis die Anweisung UNLOCK <INDEXDATEI> ausgeführt wird, die alle gesperrten Datensätze der Indexdatei freigibt. Dabei ist sicherzustellen, daß die Locktabelle groß genug ist, um alle gewünschten Datensätze zu sperren. Im Menuepunkt Programm-Generator kann bei F6=Paramater die Größe der Locktabelle festgelegt werden. Es ist zu beachten, daß diese Tabelle EBUS-intern verwendet wird. Zusätzlich dazu existiert im Netzwerk bzw. Betriebssystem eine Tabelle für die Lockeinträge. Die Größe dieser Tabelle kann vom EBUS-Programm nicht beeinflußt werden. Wenn diese Tabelle überläuft, muß das Netzwerk oder das Betriebssystem neu konfiguriert werden.
Im Mehrplatzbetrieb müssen existierende Datensätze, die mit WRITE zurückgeschrieben werden, vorher gelesen worden sein. Wird versucht, einen Datensatz mit WRITE zu schreiben, der nicht vorher gelesen wurde, so wird der Fehler 1062 gemeldet.
Ist im Netzwerk unter MS-DOS ein Datensatz, der gelesen werden soll, länger als 10 Sekunden gesperrt, so erfolgt am Bildschirm im Abstand von jeweils 10 Sekunden eine Meldung, seit wieviel Sekunden der Datensatz gesperrt ist. Das Programm wartet solange, bis der Datensatz wieder freigegeben oder die Taste <ESC> gedrückt wird. Mit <ESC> wird am Ende des nächsten 10-Sekunden-Intervalls der Zugriffsversuch abgebrochen und der Fehlerblock ON ERROR ... END ausgeführt.
Unter UNIX ist das Intervall auf 5 Sekunden eingestellt. Mit dem Befehl LOCKTIMEOUT kann dieser Wert beliebig geändert werden (aber nur unter UNIX, im Netzwerk unter MS-DOS hat LOCKTIMEOUT keine Wirkung).
Bei LOCKTIMEOUT=0 wird unter UNIX endlos gewartet, bis der Datensatz frei ist. In diesem Fall erscheint am Bildschirm keine Meldung, daß der Datensatz gesperrt ist.
DISABLE LOCKTIMEOUT führt (auch im Netzwerk) dazu, daß bei einem gesperrten Datensatz nach Ablauf des ersten LOCKTIMEOUT-Intervalls der Fehlercode 1901 geliefert wird und nicht die Meldung erscheint, daß der Datensatz seit einer bestimmten Zahl von Sekunden gesperrt ist. Unter UNIX kann mit LOCKTIMEOUT=0 beliebig lange gewartet werden, bis der Datensatz frei ist. Im Netzwerk ist dies nicht möglich. Soll dort z.B. beliebig lange auf die Freigabe des Datensatzes ohne Meldung gewartet werden, so kann dies mit DISABLE LOCKTIMEOUT folgendermaßen erreicht werden:
DISABLE LOCKTIMEOUT
N1: READ <DATEI> ON ERROR IF
OK=1901
THEN
GOTO N1
ELSE
...
ENDIF
END
Allerdings muß bei dieser Lösung sichergestellt sein, daß kein Deadlock auftreten kann. Es hängt vom verwendeten Netzwerk ab, ob dort ein Deadlock automatisch erkannt wird oder nicht.
DISABLE READLOCK führt im Mehrplatzbetrieb (Zugriffsart M und R) dazu, daß alle Datensätze aus allen Indexdateien ohne Record-Locking gelesen werden. Eventuell bereits gesperrte Sätze werden davon nicht berührt und bleiben weiter gesperrt. Das Lesen ist auch dann möglich, wenn der Datensatz durch ein anderes Programm gesperrt ist (Ausnahme: XENIX V.2, dort wird endlos gewartet bis der Datensatz frei ist). Durch diese Anweisung können im Mehrplatzbetrieb Datensätze ohne gegenseitige Blockierung gelesen werden. Allerdings hängt es in diesem Fall vom Betriebssystem ab, ob auch immer konsistente Daten geliefert werden.
|
|
|
Achtung: Wenn das Betriebssystem die vom EBUS-Programm aufgerufenen Schreibanweisungen nicht als nicht-unterbrechbare Einheiten ausführt, kann es sein, daß ein Datensatz gerade gelesen wird, während ein anderes Programm ihn gerade geändert zurückschreibt. Dadurch könnte es sich ergeben, daß der gelesene Datensatz teilweise aus alten und teilweise aus neuen Daten besteht. Dieser Fall ist zwar relativ unwahrscheinlich, sollte aber dennoch berücksichtigt werden. |
Das bisher beschriebene Record-Locking bezog sich ausschließlich auf die Datensätze der Indexdateien. Im EBUS-Programm werden intern aber kurzfristig jeweils auch die Sätze im Indexbaum gesperrt, um die Konsistenz der Daten sicherzustellen. Ist ein Satz im Indexbaum länger als 2 LOCKTIMEOUT-Intervalle gesperrt, so erfolgt eine Fehlermeldung. Dies deutet darauf hin, daß im System etwas nicht in Ordnung ist oder ein Programm "hängt". Es sollte dann in jedem Fall durch entsprechende Beantwortung der am Bildschirm erscheinenden Frage ein erneuter Zugriffsversuch unternommen werden, da sonst bei Schreibzugriffen der Indexbaum defekt werden kann und reorganisiert werden muß. Dies wird bei der Meldung am Bildschirm mitgeteilt. Bleibt der Satz im Indexbaum länger gesperrt, so kann das, da intern die Sätze vom Programm immer nur kurzzeitig gesperrt werden, nur folgende Gründe haben:
· Ein Benutzer hat auf seinem PC die Taste <CTRL/NUMLOCK> gedrückt und damit das Programm während des Zugriffs auf den Indexbaum angehalten oder
· ein Programm im Netzwerk wurde durch Warmstart oder Stromausfall abgebrochen. In diesem Fall bleiben im allgemeinen (je nach Netzwerk) die Datensätze solange gesperrt, bis sich der Benutzer erneut im Netzwerk angemeldet hat.