markus: Datensatz sperren

Hallo
Folgendes Problem:
Nach Eingabe eines Suchbegriffs erhält man sämtliche informationen zu diesem Begriff. In einem Formular kann ich nun Änderungen an diesem Eintrag vornehmen. Z.b Name ändern, PC-Type ändern etc. Nach Änderung kann ich diese wieder in der DB(Access) speichern.

Meine Problem ist jetzt das mehrere Personen auf dieses Formular und evtl. auch auf den gleichen Datensatz zugreifen können und dementsprechend auch ändern können.

Meine Frage: Gibt es eine Möglichkeit wie ich einen Datensatz nach dessen AUfruf für alle anderen Benutzer sperren kann.

Bin für jede Info dankbar.

  1. Hallo,

    welche DB benutzt du denn?

    Die mesiten bieten eine Lock-Funktion an. Dazu bitte in die Doku kucken.

    Wenn nicht kannst du das manuell erledigen. z.B ein Boolean-Feld anfügen, das nach dem lesen gesetzt wird.

    Nimmt eine Funktion einen Datensatz und dieses Flag ist gesetzt, kannst du in deinem Code mitteilen --> Momentan keine Änderung möglich.

    Nachdem die Maschine, die den Datensatz anforderte diesen gespeichert hat kannst du die Blockierung wieder aufheben. Dazu müsstest du aber den Client erkennen. z.B über ein weiteres Feld mit Clientbezogenen Daten SessionID o.ä. an dem du vergleichen kannst.

    Odium

  2. Hi Markus,

    Meine Frage: Gibt es eine Möglichkeit wie ich einen Datensatz nach dessen AUfruf für alle anderen Benutzer sperren kann.

    So solltest du bei einer Web-Anwendung nicht arbeiten. Du kannst nicht vorhersehen, ob der Anwender den Datensatz wirklich ändern will, oder ob er nach der Anzeige einfach auf eine andere Seite geht, oder den Browser schließt. (Okay, das geht über onUnload, aber was wenn der Browser abschmiert?)

    Besser ist die Benutzung sogenannter Concurrency-IDs. Dazu hat jede Tabelle in deiner Datenbank ein zusätzliches Feld, bei uns heißt es ConcurrencyID. Wird nun ein Datensatz gelesen, wird diese ConcurrencyID mit gelesen. Ändert der Anwender jetzt diesen Satz und speichert ihn, liest die Update-Routine jetzt zuerst den Satz nochmals aus der DB, vergleicht die ConcurrencyID aus der DB mit der im Speicher. Sind beide gleich, wird die ConcurrencyID um eins hochgezählt und gespeichert.
    Sind beide unterschiedlich, wurde der Datensatz mittlerweile geändert, und das Speichern abgelehnt.

    Gruß,
    Martin