M
I
N
I
S
Y
S
©
O
R
G
T
U
T
O
R
I
A
L
S
  Datensatzsperre / Locking (U/S/D) - V7081
U = Sektion für den Anwender
S = Sektion für den Systemverwalter
D = Sektion für den Entwickler (Vorsicht Technik!)

U
Um Datenkonflikten vorzugreifen, werden entweder einzelne Datensätze oder auch ganze Datenbestände von MINISYS kurzzeitig gegen Änderungsversuche gesperrt.
Ruft z.B. ein Teilnehmer einen Adressdatensatz auf, um ihn zu bearbeiten, so wird dieser Datensatz von MINISYS zur parallelen Bearbeitung gesperrt. Von diesem Mechanismus merkt der Teilnehmer im Regelfall nichts, erst wenn ein Teilnehmer einen gesperrten Datensatz aufrufen möchte, erhält er einen Hinweis, dass der angeforderte Datensatz von einem anderen Benutzer aktuell bearbeitet wird. Der Datensatz wird zwar angezeigt, Änderungen sind aktuell jedoch nicht möglich.

Auch wenn ein neuer Datensatz erfasst werden soll, z.B. Kunde 10001 soll in einer Datenerfassungs Maske angelegt werden, diesen Kunden gibt es allerdings noch nicht, so wird auch dieser nicht existierende Datensatz von MINISYS gesperrt.

Die Datensatzsperre wird von MINISYS beim Abspeichern des Datensatzes wieder aufgehoben. Die Sperre wird auch aufgehoben, wenn z.B. eine andere Kundennummer aufgerufen wird oder die Erfassungsmaske verlassen wird. Die Sperre bleibt allerdings bestehen, wenn das entsprechende Fenster durch den Benutzer zwangsweise geschlossen bzw. der Browser im geöffneten Zustand des Fensters geschlossen wird.

Ist ein Browserfenster zwangsweise geschlossen worden, so wird die Satzsperre beim Abmelden des Teilnehmers ebenfalls aufgehoben. Meldet sich ein Teilnehmer nicht von MINISYS ab, so würde der "User-Idled-Agent (008)" die Sperren des Teilnehmers bei dessen Zwangsabmeldung ebenfalls mit aufheben.

S
Das Lockingmanagement in MINISYS ist auf die Betriebsform Intranet/ Internet speziell angepasst und optimiert worden. Datensatzsperren betreffen sowohl Konsolenanwendungen als auch WEB-Anwendungen gleichermaßen, es wird generell derselbe Lockdatenbestand verwendet.
Erhalten Sie Hinweise auf ein ungewolltes Locking, so können Sie im Systemmanager Bereich (Rescue -->System -->Maintain) das Programm "Lockstatus" aufrufen. In diesem Programm werden Ihnen sämtliche aktuelle Locks angezeigt. Neben den gelockten Segmenten erhalten Sie auch Auskunft darüber, wann der Lock erstellt wurde und von welchem Gerät bzw. ID dieser initiiert wurde.
In diesem Programm haben Sie nun die Möglichkeit, aktiv in das Locking Management von MINISYS einzugreifen.

Durch das Anklicken des entsprechenden Segmentes wird dieses sofort wieder freigegeben und der Eintrag aus der Lockingtabelle entfernt.
Weiterhin besteht noch die Möglichkeit, einen s.g. Deadlock durchzuführen.
Hiermit ist, entgegen der landläufigen Verwendung des Begriffes, gemeint, dass Sie sämtliche aktuell gültige Sperren mittels eines Tastendruckes aufheben können. Danach ist keine Satzsperre mehr aktiv und die Lockingtabelle ist vollkommen leer.

D
Zuständig für das Locking ist die zentrale Lockroutine "^MINISYSlock". Diese wird, genau wie der gleichlautende Lockbefehl in der unterliegenden Programmierumgebung M, mit den selben Parametern dotiert. Eine Rückmeldung des Lockvorganges wird durch die Systemvariable "$T" rückgemeldet. MINISYS führt nur einen physischen Lock während des Durchlaufes von "^MINISYSlock" durch, der Global "^MINISYSlock" wird während der Dotierung bzw. der Abfrage gelockt. Somit ergibt sich, dass es keine Limits in Bezug auf die Quantität der Locks ergibt.
Die Lockhierarchie von M wird ebenfalls eingehalten.

Beispiele:

Do ^MINISYSlock("^A") versucht, den Global ^A vollständig zu locken, wartet, bis das erfolgt ist und setzt $T auf 1. Alle anderen aktuellen Locks dieser Gerätes bzw. dieser ID werden aufgehoben.

Do ^MINISYSlock("^A",0) versucht, den Global ^A vollständig zu locken, ohne auf eine Freigabe zu warten, das Ergebnis wird in $T (0/1) abgebildet. Alle anderen aktuellen Locks dieser Gerätes bzw. dieser ID werden aufgehoben.

Do ^MINISYSlock("^A",10) versucht, den Global ^A vollständig zu locken und wartet maximal 10 Sekunden auf eine Freigabe, das Ergebnis wird in $T (0/1) abgebildet. Alle anderen aktuellen Locks dieser Gerätes bzw. dieser ID werden aufgehoben.

Do ^MINISYSlock("^A(100)",0) versucht, den Global ^A mit dem Erstsubscript "100" zu locken, ohne auf eine Freigabe zu warten, das Ergebnis wird in $T (0/1) abgebildet. Alle anderen aktuellen Locks dieses Gerätes bzw. dieser ID werden aufgehoben.

Do ^MINISYSlock("^A(100,x)",0) versucht, den Global ^A mit dem Erstsubscript "100" und dem Zweitsubscript dem Inhalt der lokalen Variable "x" zu locken ohne auf eine Freigabe zu warten, das Ergebnis wird in $T (0/1) abgebildet. Alle anderen aktuellen Locks dieses Gerätes bzw. dieser ID werden aufgehoben.

Do ^MINISYSlock("^A(100,x,""TST"")",0) versucht, den Global ^A mit dem Erstsubscript "100", dem Zweitsubscript de, Inhalt der lokalen Variable "x" und Drittsubscript mit dem Klartext "TST" zu locken ohne auf eine Freigabe zu warten, das Ergebnis wird in $T (0/1) abgebildet. Alle anderen aktuellen Locks dieser Gerätes bzw. dieser ID werden aufgehoben.

Durch das Vorsetzen des Pluszeichens "+" bzw. Minuszeichen "-" vor dem zu lockendem Argument wird der Lockstack entsprechend erhöht (+) bzw. wieder abgebaut (-), bis der Lock nicht mehr vorhanden ist. Ein Lock mit vorgestelltem Zeichen (+/-) hebt die anderen aktuell gültigen Locks NICHT auf!

Ein genereller Unlock des aktuellen Gerätes bzw. der aktuellen ID wird durch Do ^MINISYSlock("") eingeleitet.

Bitte bedenken Sie, das in MINISYS gesetzte Locks auch nach einem Restart nach wie vor ihre Gültigkeit besitzen!