# Theoriefrage : mehrere User vs gleichen Datensatz



## Tallan (18. Aug 2009)

Hallo Zusammen,

ich bin grade dabei ein Programm zu schreiben das mitunter Daten von einem mysql Server ausliest diese bearbeitet und wieder zurückspielt.
Etwas Sorgen bereitet es mir wenn Mr.x Daten abfragt und editiert während Mr.y grade eine Änderung der selbigen Daten sendet.

Ein einfaches Beispiel. Die Sql Tabelle enthält nur eine ID und ein Infofeld
Der User kann dieses Infofeld einlesen editieren und wieder an die Datenbank senden.
Diesen vorgang machen aber mehrer Userer unter umständen Zeitgleich bzw. Überschneident.

Mein Frage, wie gehe ich hier am besten vor.
Den Datensatz zu blocken wäre eine idee aber wie genau ?
Eine Flag in der Tabelle setzen mit einer programmspezifische id, das a) für andere sperrt und b) abgefragt werden kann ob geschrieben werden darf ?


Beispiel hierzu :

Tabelleninhalt
ID 1 | Infotext : bla | Schreibflag : none |

User will schreiben -> Schreibflag abfragen, wenn = none -> schriebe spezifische zahl ins flag

ID 1 | Infotext : bla | Schreibflag : 123456... |

frage ab ob diese zahl in der flag steht -> falls ja schreibe -> nach beendigung löschen

Falls eine andere Zahl im Flag steht -> Fehlermeldung.



Gibt es diesbezüglich bessere Ansätze oder bereits vorimplementierte Lösung ?


----------



## sparrow (18. Aug 2009)

Ich weiss nicht ob mySQL etwas Vergleichbares kennt, aber unter postgres gibt es die Möglichkeit folgendes Statement abzusetzen:


```
SELECT .... FROM .... [WHERE .... ] FOR UPDATE
```

Die dazugehörige Transaktion sperrt die selektierten Datensätze dann. Andere FOR UPDATE-Abfragen blockieren dann so lange bis die erst Transaktion abgeschlossen ist.


----------



## Tallan (18. Aug 2009)

das wäre natürlich ein interesanter ansatz wobei man dann wieder vor dem editierne den datensatz abfragen müsste da er sonst ja schon bei der generellen abfrage gesperrt wäre


----------



## schalentier (18. Aug 2009)

Hibernate hat pro Tabelle noch ein Version-Feld. Der Wert dort drin wird bei jedem Commit um eins hochgezaehlt. Vor einem Commit wird ueberprueft, ob der Wert gleich geblieben ist, ansonsten musst du dir ueberlegen, was passieren soll (Commit abbrechen, User fragen, nach erneutem Update weiteren Commit probieren, Daten mergen, ...).


----------



## sparrow (18. Aug 2009)

Tallan hat gesagt.:


> das wäre natürlich ein interesanter ansatz wobei man dann wieder vor dem editierne den datensatz abfragen müsste da er sonst ja schon bei der generellen abfrage gesperrt wäre



Ich hab das mal für ein Buchungssystem gebraucht wo auf gar keinen Fall ein Platz 2x vergeben werden durfte, es aber nicht unwahrscheinlich ist, dass 2 zeitnahe Zugriffe auf den Datensatz erfolgen.


----------

