[MySQL] Eine Tabelle, mehrere Nutzer - Zeilen sperren (lock)?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [MySQL] Eine Tabelle, mehrere Nutzer - Zeilen sperren (lock)?

    Guten Abend zusammen,

    ich möchte mein Projekt ausbauen und momentan steht das Problem an, was meine Anwendung macht, wenn mehrere Benutzer an einer Tabelle arbeiten. (MySQL InnoDB, PHP 5)

    Grob dargestellt:
    In der Tabelle sind viele einzelne Einträge, und jeder Benutzer würde jeweils an einem zur Zeit arbeiten. Bisher bestand nicht die Notwendigkeit, zu prüfen ob der Datensatz den man nun bearbeiten möchte bereits von jemand anderem bearbeitet wird. Dies soll/muss jetzt geändert werden.

    Mein Ziel ist also, bevor ein Nutzer einen Datensatz bearbeiten kann, zu prüfen ob jemand anders gerade daran arbeitet, und falls das der Fall ist, die Möglichkeit der Bearbeitung zu verwehren bis der erste Benutzer fertig ist.

    Ich hatte daher die Möglichkeit bei InnoDB gefunden, wo es möglich ist, mit InnoDB auch einzelne Zeilen in einer Tabelle zu sperren, wie dies sonst mit "Lock Tables" für Tabellen möglich ist.

    Da ich mich damit noch nicht umgehend befassen konnte und auch nicht weiß, ob das nötig ist, wollte ich vorher Fragen wie sinnvoll das für einen solchen Anwendungsbereich ist. Oder ob man in der Anwendung selber verwalten sollte, welcher Benutzer gerade was bearbeitet oder ob es gar andere Möglichkeiten gibt?

    Wäre nett wenn mir jemand von euch einen Denkanstoß liefern könnte oder von seinen Erfahrungen (kurz) Berichten könnte bezüglich dieser Herausforderung.

    Vielen Dank und eine schönes Wochenende,
    FeGm

  • #2
    Hallo,

    da Zugriffe auf geLOCKte Tabellen oder Datensätze einfach blockieren, bis diese wieder freigegeben werden, ist diese Methode nur für kurzzeitige Operationen sinnvoll. Sonst würde ein Benutzer den Datensatz auschecken, eine halbe Stunde daran rumfummeln (Kaffeetrinken, da noch ein Anruf und dort noch schnell was für die Hauspost fertig machen) und alle anderen müssen genau so lange warten, bis die Anwendung wieder reagiert.

    Die einfachste Variante ist eine allumfassende Where-Klausel beim Update zu benutzen, d. h. es wird nicht nur sowas wie
    Code:
    where id=3261
    beim Update verwendet, sondern es werden alle Spalten mit der vorherigen Version abgeglichen. Dadurch schlägt das Update automatisch fehl, wenn zwischenzeitlich ein anderer Benutzer was verändert hat. Dem aktuellen Benutzer kann das dann von der Anwendung entsprechend signalisiert werden, so dass der die Möglichkeit bekommt, den Konflikt aufzulösen.

    Gruß,

    Amica
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      Optimistic concurrency control

      In Doctrine wird es Optimistic Locking genannt und durch ein Versions-Feld mit dem Typ Integer realisiert. Bei jeder Änderung wird die Version um 1 erhöht. Bearbeiten also zwei Benutzer die Version 27 eines Eintrags, wird sie beim ersten Speichervorgang auf 28 gesetzt. Wenn jetzt der zweite Benutzer auch speichern möchte, geht das nicht, weil er ja die Version 27 bearbeitet hat, diese aber nicht mehr aktuell ist. Wie dann dieser Fehler behandelt wird, entscheidet der Programmierer.
      Zuletzt geändert von h3ll; 24.04.2010, 09:42.

      Kommentar


      • #4
        Danke das sind schon mal sehr gute Ideen. Mir war nicht bewusst das ein Lock soviel anhält, dachte ich könnte damit schreib Zugriff auf eine Zeile sperren und fertig :/

        Danke für die Ideen, werde wohl Optimistic Locking mit Int oder Timestamp vorziehen, da es bei größeren Datenmengen nicht so lastig für die DB ist, diese zu vergleichen. Zusätzlich werde ich mit Ajax regelmäßig prüfen, ob jemand schneller war beim bearbeiten und dies ggf. ausgeben

        Kommentar

        Lädt...
        X