nick: datenbank zugriff jeweile nur einer

Hallo,

ich arbeite mit mysql.

wir benötigen eine db Anwendung wo mehrere user gleichzeitig mit arbeiten aber jeder Datensatz nur einzelnt aufgerufen werden kann.

Heißt wenn Datensatz x von user y aufgerufen wurde soll bei user z der datensatz x übersprungen werden.

mbg

nick

  1. Mahlzeit nick,

    wir benötigen eine db Anwendung wo mehrere user gleichzeitig mit arbeiten aber jeder Datensatz nur einzelnt aufgerufen werden kann.

    Du könntest Datensätze sperren ...

    Heißt wenn Datensatz x von user y aufgerufen wurde soll bei user z der datensatz x übersprungen werden.

    Definiere "aufgerufen": was meinst Du damit? Du meinst, wenn ein Benutzer (Was für ein Benutzer? Ein Datenbank-Benutzer? Oder ein Benutzer der Anwendung? Dort eindeutig identifizierbar?) einen Datensatz per SELECT-Abfrage gelesen hat, soll dieser Datensatz für alle anderen Benutzer nicht sichtbar sein?

    Du könntest z.B. nach jeder SELECT-Abfrage bei allen Datensätzen, die im Ergebnis enthalten sind, die ID des aktuellen Benutzers in irgendeiner Form (z.B. CurrentUserID o.ä.) beim beim Datensatz speichert. Abfragen dürfen dann natürlich nur noch alle Datensätze zurückgeben, wo diese ID gleich der ID des aktuellen Benutzers oder NULL ist.

    Warum willst Du das? Welcher tiefere Sinn steckt dahinter? Möglicherweise ist nämlich eine ganz andere Vorgehensweise erheblich sinnvoller - dazu müsste man aber wissen, was Du bezwecken willst.

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
  2. Hi!

    wir benötigen eine db Anwendung wo mehrere user gleichzeitig mit arbeiten aber jeder Datensatz nur einzelnt aufgerufen werden kann.
    Heißt wenn Datensatz x von user y aufgerufen wurde soll bei user z der datensatz x übersprungen werden.

    Dann könntest du dir etwas überlagen, das

    • die Tabelle für alle anderen Zugriffe (auch Lesen) sperrt,
    • sich einen Datensatz sucht, der noch nicht als "in Bearbeitung" gekennzeichnet ist,
    • diesen Datensatz als "in Bearbeitung" kennzeichnet (am besten noch, wer ihn bearbeitet),
    • die Sperre wieder aufhebt.

    Das solltest du am besten so gestalten, dass der Vorgang nicht aus Versehen unterbrochen wird. Eine Stored Procedure bietet sich da an.

    Lo!

  3. Hello,

    ich arbeite mit mysql.

    Ich vermute jetzt mal, dass das Ganze üer HTTP / HTTPs geschehen soll?
    Dann ist keine Verbindung zum Client vorhanden und damit mit einfachen Mitteln keine Zustandsorientierung möglich.

    wir benötigen eine db Anwendung wo mehrere user gleichzeitig mit arbeiten aber jeder Datensatz nur einzelnt aufgerufen werden kann.

    Heißt wenn Datensatz x von user y aufgerufen wurde soll bei user z der datensatz x übersprungen werden.

    Sperren von Datensätzen im Datenhaltungssystem sollten immer so kurz wie möglich gehalten werden.
    Daher wird die echte Sperre erst beim tatsächlichen Kontrolllese-/Schreibvorgang vorgenommen, wenn der Kontrolllesevorgang ohne Beanstandungen war.

    Für eine zeitversetzte Sperre gibt es zwei praktikable Möglichkeiten. Beide berücksichtigen entsprechende Spalten im Datenmodell.

    Antizipatorisches Sperren:
    Du kannst in Deinem Datenmodell / deiner Applikation ein entsprechendes Flag, bestehend aus Usernummer und Zeitstempel vorsehen, dass bei der Datenmanipulation auf jeden Fall abgefragt werden muss. Beim Lesen zum Zwecke der Verarbeitung wird dieses auf die Usernummer und den Zeitpunkt des "Antrages" gesetzt, vorausgesetzt, dass es vorher auf neutral stand. Zusätzlich kann ein Konfliktzähler für die Schreibvorgänge mitgeführt werden. Wird nun ein "Bearbeitungsantrag" gestellt, wird zuerst geschaut, ob bereits ein Bearbeiter mit einer noch gültigen Zeit eingetragen ist. Nur, wenn dies nicht der Fall ist, werden die Flags gesetzt.
    Das Abfragen und setzen funktioniert dabei in EINEM EINZIGEN Statement per Update-Versuch

    update <tabelle>
        set usernr = '$usernr' and 'begin' = now()
        where begin < now() - $timeslot or (usernr = 0 and begin = 0);

    Erst wenn dieses Statement failed, ruft man übr ein select die Spalten usernr und begin auf, um den Grund dafür zu erfahren.

    Das Rückschreiben der Daten muss ein entsprechendes where-Statement enthalten, das dann die passende Benutzernummer und den Timestamp (sowie den Konfliktzähler) auf Übereinstimmung prüft.

    Optimistisches Sperren mit Konfliktzähler:
    Man holt sich einfach die Daten zur Bearbeitung nebst eines im Datnblock enthaltenen Konfliktzählers. Beim Rückschreibversuch wird dieser auf Übreinstimmung geprüft und wenn diese vorliegt, wird der Zähler um eins erhöht. Auch dies muss in einem einzigen Statement geschehen!

    Geht der Schreibversuch fehl, hat man das philosophische Problem, was man mit den veränderten Daten nun anstellt. Schließlich hat der User Zeit und Arbeit darin investiert, sie zu verändern und möchte wahrschinlich ungern alle snochmal eingeben. Allerdings wird er nicht darum herum kommen, sch über den Status Quo des Datensatzes zu informieren und seine Veränderungen dnn ggf. darauf anzuwenden.

    Bei der Installation solcher Maßnahmen sollte man auch immer daran denken, dass andere Module ggf. die automatische Verarbeitung mehrerer Datensätze auf einmal vornehmen müssen. Es muss also möglich sein, auch auf eine "echte" Sperre Rücksicht zu nehmen, die innerhalb der Laufzeit eines Scriptes ja möglich bleibt.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de