Mehrbenutzerbetrieb, Konsistenz von Daten

Hi,

ich bin grad dabei mir zu überlegen, wie ich sicherstellen kann, dass in einem Mehrbenutzersystem immer die richtigen und aktuellen Daten vorliegen.
Dazu ein Beispiel:

Nutzer “a” ruft einen Datensatz auf und stellt fest das eine Information fehlt und entscheidet ihn zu bearbeiten.
Nutzer “b” ruft den gleichen Datensatz auf, bevor “a” mit seinen Veränderungen fertig ist, auch b will den Datensatz formatieren und bearbeitet ihn. Jetzt führen beide nacheinander den Update durch. Die Daten desjenigen der als erstes ein Update ausführt sind weg…

Wie kann ich dieses Problem umgehen? ich kann mir natürlich jedesmal eine art Flag setzen in einer Tabelle oder direkt bei dem Eintrag in der DB aber das sorgt immer für ein bisschen mehr Traffic.

Außerdem bliebe dabei das Problem zu entscheiden, wann ein Nutzer fertig ist mit seiner Arbeit bzw ist es unmöglich festzustellen ob er vielleicht das Fenster geschlossen hat und der Eintrag wieder jedem zur bearbeitung zur verfügung steht.

Habt ihr euch schonmal darüber Gedanken gemacht? Oder vielleicht so gar eine Lösung :wink:

Meine Frage ist obs da ne DB-seitige Lösung gibt, die ein ein/austragen von daten(sows wie ne flag) unnötig macht.

Hoffe ich hab das Problem ausrechend erklärt!

Vielen Dank für eure Mühe!
Crypi

hi,

nun ja die lösung ist, das du vor dem update auf den datensatz ein select machst und vergleichst, ob sich die daten geändert haben, wenn ja nachfrage ob überschrieben werden soll.

alternativ kannst du den datensatz auch sperren und einem anderen user den (schreib)zugriff sperren. ist aber u.u. nicht gerade ungefährlich (stichwort mittagspause…)

cu tb.

wie läuft das mit dem sperren?

Select for update gilt ja nur in der Transaktion, also z.b. in der die den select am anfang startet. Oder ahb ich ds Prinzip noch nicht verstanden?

Crypi

schau dir mal den befehl LOCK an (http://www.postgresql.org/docs/8.1/static/sql-lock.html)

cu tb.

aber auch die LOCKS sind nach abschluss der transaktion wieder futsch… oder ahb cih dsa falsch verstanden?

Crypi

ähm klar. sobald du ein commit machst sagst du der datenbank “alles ist ok” und damit sind die daten fest und der lock weg. alles andere wäre doch auch blödsinn. das lock müsste an sich schon nach dem update/insert weg sein wenn du keine transaktion nutzt…

sry ich glaub wir reden grad irgendwie aneinander vorbei :confused: aber ich geh jetzt mal wieder ins bett. bin krank… befass mich später nochmals mit deinem problem - wenn du es bis dahin nicht gelöst hast…

cu tb.

ja ich glaub wir reden aneinander vorbei :slight_smile:

ich erklärs nochmal:

es befinden sich datensätze in einer db die von mehreren nutzern angesehen oder verändert werden können.
wenn sich ein nutzer einen datensatz aufruft diesen ansieht und entschiedet, dass er ihn verändern will, so ist parallel dazu auch ein anderer nutzer in der lage sich den gleichen datensatz anzusehen und zu ändern.
wenn jetzt gleichzeitig von beiden nutzern geändert wird und dann nacheinander die daten auktualisiert werden, sind die daten desjenigen der zuersta auf aktualisieren geklickt hat wieder weg, weil der nach ihm seine daten darüber geschireben hat.

ich möchte jetzt ein sperre einrichten, so etwas wie read-only, sodass der zweite nutzer zwar lesen aber nciht aktualisieren kann während der erste nutzer an dem datensatz arbeitet.

Gute Besserung!
Crypi

so bevor ich jetzt wirklich ins bett gehe…

speichere den alten datensatz zwischen, mache vor dem update einen select auf den datensatz und prüfe, ob dieser gleich dem zwischengespeicherten ist. wenn ja überschreibe ihn mit den daten der eingabe. ansonsten frage nach oder verweigere…

so hab ich das mal an der schule gelernt und schaut imo auch sinnvoll aus :wink:

cu tb.

na dann gehts auch eleganter :wink:
ich speichere einen timestamp in einer spalte, immer dann wenn der datensatz aktualisiert wird. sobald ich den datensatz zum bearbeiten öffne, speichere ich die aktuelle zeit einem feld und vegleiche dann vorm update ob der letzte timestamp “jünger” ist als die zeit als ich angefangen hab den datensatz zu bearbeiten.

aber das ist mir alles zu unelegent, ich würd da gern von datenbank seite was machen, aber das geht wohl nciht oder?

Crypi

theoretisch kannst du den datensatz locken. wie das allerdings mit php funktioniert (unterstell dir jetzt einfach mal du machst das auch damit) weiß ich nicht. bei einem normalen programm kannst du eine transaktion starten, den ds sperren und dann warten was der user macht…

klar würde das mit dem ts auch gehen aber die frage ist wie gut dein programm sein soll. du kannst anzeigen das was geändert wurde, ich kann sagen dies und jenes wurde geändert… sag mal meine lösung ist eleganter - deine schneller.

cu tb.

hat alles so seine vor und nachteile. ich werd da nochmal drüber nachdenken.

hmm…doof das. würd das so gern db-seitig machen schnüff

verschwinde ins bett sonst wirst nie gesund :wink:

Crypi