Verwendung von USE Datei EXCLUSIVE

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Werner
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 123
Registriert: Sa, 18. Mär 2006 16:08

Verwendung von USE Datei EXCLUSIVE

Beitrag von Werner »

Hi!

Ich habe in meinem Programm öfters den USE-Befehl mit EXCLUSIVE kombiniert, weil ich irgendwann einmal der Meinung war, dass ieses Attribut notwenig sei, wenn ich z.B. die entsprechende Datei mit SORT ON sortieren möchte. Jetzt macht mir dieses Attribut EXCLUSIVE zunehmend Probleme, wenn im Netz zwei oder mehr Anwender auf eine bestimmte Datei zugreifen möchten.

Frage: Wozu dient dieses EXCLUSIVE eigentlich? Sollte ich es nicht besser ganz weglassen oder eventuell durch SHARED ersetzen, damit mehrere Anwender nacheinander auf eine bestimmte Datei im Netz zugreifen können? Kann ich aber dann noch sauber sortieren?

Ich habe auch den Befehl: SET EXCLUSIVE ON an mehreren Stelln im Programm gesetzt. Kann dies auch ggf. die Ursache für meine Zugriffsprobleme sein?

Mit freundlichen Grüßen
Werner
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21248
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 211 Mal
Danksagung erhalten: 71 Mal

Re: Verwendung von USE Datei EXCLUSIVE

Beitrag von Manfred »

Hi Werner,

dieser Befehl hat schon seinen Sinn und Zweck. Allerdings nur im Mehrbenutzerbetrieb. Dort soll nämlich für diverse Operationen verhindert werden, dass mehrere User gleichzeitig auf die DBF zugreifen .

Sobald Du aber einen Mehrbenutzerbetrieb herstellen möchtest, solltest Du Dich einmal näher mit den Netzwerkfunktionen auseinandersetzen. Dazu ist einiges in der Anleitung geschrieben. Rlock() z.B.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9394
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 105 Mal
Danksagung erhalten: 364 Mal
Kontaktdaten:

Re: Verwendung von USE Datei EXCLUSIVE

Beitrag von Tom »

Hallo, Werner.

EXCLUSIVE macht genau das, was es sagt: Eine Tabelle wird exclusiv geöffnet, und damit für die Verwendung durch andere gesperrt. Diese erhalten dann beim Zugriff einen Laufzeitfehler, den man abfangen kann:

Code: Alles auswählen

USE MeineDatei
IF NetErr()
  MsgBox('Datei ist gesperrt')
  RETURN
ENDIF
Exclusive Nutzung ist ein Don't bei Programmen, die von mehreren Benutzern gleichzeitig verwendet werden. Wenn man die Klausel einfach weglässt (und SET EXCLUSIVE OFF im Code hat!), werden Tabellen automatisch im Shared-Modus geöffnet. Dieser lässt aber einige Operationen nicht zu, etwa DbZap(), DbPack(), DbSort(), aber auch OrdCreate() (INDEX ON ... TO). In diesem Fall erhält man bei einer im Shared-Modus geöffneten Datei ebenfalls Laufzeitfehler ("Datei muss für Operation exclusiv geöffnet sein"). Deshalb verwendet man solche Operationen nur in Serviceroutinen. DbZap() ist sowieso etwas, das man bestenfalls mit temporären Hilfsdateien tun sollte. Wenn etwas wie DbSort() oder DbPack() wirklich erforderlich sind, sollte man das in Routinen betten, die entsprechend abgesichert sind. Übrigens kann man das EXCLUSIVE aus dem USE weglassen, wenn man ohnehin mit SET EXCLUSIVE ON arbeitet.

Wenn man im Shared-Modus arbeitet, müssen die Datensätze, die man verändert, vorher gesperrt (gelockt) werden, das muss man bei exclusiver Verwendung nicht. Deshalb musst Du eigentlich Deinen gesamten Code überarbeiten, etwa in dieser Art:

Code: Alles auswählen

PROCEDURE KundenAenderungenSpeichern()
IF !RLock()
  MsgBox('Daten werden von einem anderen Benutzer bearbeitet')
  RETURN
  ELSE
  REPLACE ... WITH ...
  ....
  UNLOCK
ENDIF
RETURN
Das ist kein gut (gemachte)s Beispiel, aber es geht um das Prinzip. Bei geteilter Nutzung muss man Datensätze bei allen Veränderungen sperren, auch für DELETE. APPEND (BLANK) löst ein implizites Locking auf dem neuen Datensatz aus, den man anschließend entsperren muss.

Will sagen: Du hast eine Menge Arbeit vor Dir. :wink:
Herzlich,
Tom
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9394
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 105 Mal
Danksagung erhalten: 364 Mal
Kontaktdaten:

Re: Verwendung von USE Datei EXCLUSIVE

Beitrag von Tom »

Ergänzung: Bei der Verwendung von DbSort() sollte man sich fragen, ob dies sinnvoll ist. Eigentlich kann man alles, was mit der Reihenfolge von Tabellen zu tun hat, über entsprechende Indexe (auch temporäre oder Teilindexe) lösen. DbSort() erzeugt eine Kopie der Tabelle. Das ist rechenzeitintensiv und eben nur bei exclusiver Nutzung möglich. Demgegenüber werden Indexe automtisch gepflegt, wenn Datensätze verändert werden (wofür wichtig ist, dass bei Änderungen immer alle Indexe geöffnet sind), und wenn man eine neue Sortierung benötigt, schaltet man einfach auf den Index um (DbSetOrder()). Früher, in Clipper-Zeiten, ging man mit Indexen und überhaupt Dateien sparsam um, aber heutzutage ist das nicht mehr so notwendig. Ob eine Tabelle fünf oder zehn Indexe hat, spielt kaum eine große Rolle (solange die Virenscanner sauber konfiguriert sind).
Herzlich,
Tom
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9394
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 105 Mal
Danksagung erhalten: 364 Mal
Kontaktdaten:

Re: Verwendung von USE Datei EXCLUSIVE

Beitrag von Tom »

Noch eine Ergänzung: Lies in der Doku einfach mal das Kapitel "Datenbanken im konkurrierenden Betrieb". :wink:
Herzlich,
Tom
Antworten