T
tuxedo
Gast
Hallo zusammen,
ich bastle hier eine Client-Server-Anwendung die auf Serverseite Daten aus der DB holt und die Objekte dem Client anbietet. Der kann sie anzeigen, modifizieren, löschen, ...
Stehe nun vor dem Design-Problem: Wie geh mich mit gleichzeitigen Zugriffen um?
Szenario:
*Fupp* Änderungen von Client2 sind nun weg.
Gibt es da Patterns wie man das am besten angeht?
Ansatz 1:
Mein erster naiver Ansatz wäre gewesen, dass der Client Objekte, die er editieren will, beim Server mit einem "exclusive edit/write-lock" versehen kann. Dann könnte Client2 ihm während der Änderung nicht dazwischen pfuschen.
Problem dabei: Was ist wenn Client1 vergisst den lock zu entfernen (bzw. speichern zu drücken)? Dann müsste ein Timeout oder so her...
Ansatz 2:
Versionierung der Datensätze. Client1 holt sich das Objekt, welches Version 1 hat. Client2 macht nun seine Änderungen vor Client1 und inkrementiert die Versionsnummer auf 2. Wenn Client1 nun speichern will, wird erkannt dass sich die Version in der zwischenzeit geändert hat (Hibernate -> Rollbackexception oder so).
Problem: Client1 muss dann irgendwie die Daten mergen. Das kann UI technisch wohl recht aufwendig/doof werden.
Ansatz 3:
Pech gehabt: Wer zuletzt speichert gewinnt.
Bisher gefällt mir Ansatz #1 am besten. Aber ich hab das mit dem Timeout noch nicht ganz ausgetüftelt.
Was sagen die Experten hier dazu?! Gibts weitere Vorgehensweisen? Gibt's irgendwo Lesestoff dazu (mir ist das passende Suchwort noch nicht eingefallen)?
Gruß
Alex
ich bastle hier eine Client-Server-Anwendung die auf Serverseite Daten aus der DB holt und die Objekte dem Client anbietet. Der kann sie anzeigen, modifizieren, löschen, ...
Stehe nun vor dem Design-Problem: Wie geh mich mit gleichzeitigen Zugriffen um?
Szenario:
Client 1 holt sich Objekt A und fängt an es zu editieren. Vor dem abspeichern geht er in die Mittagspause.
Client 2 ist auf Diät und arbeitet weiter. Er holt sich ebenfalls Objekt A vom Server (welches beim Client 1 noch offen ist), macht größere Änderungen und speichert diese.
Client 1 kommt aus der Mittagspause zurück und klickt speichern.
Client 2 ist auf Diät und arbeitet weiter. Er holt sich ebenfalls Objekt A vom Server (welches beim Client 1 noch offen ist), macht größere Änderungen und speichert diese.
Client 1 kommt aus der Mittagspause zurück und klickt speichern.
*Fupp* Änderungen von Client2 sind nun weg.
Gibt es da Patterns wie man das am besten angeht?
Ansatz 1:
Mein erster naiver Ansatz wäre gewesen, dass der Client Objekte, die er editieren will, beim Server mit einem "exclusive edit/write-lock" versehen kann. Dann könnte Client2 ihm während der Änderung nicht dazwischen pfuschen.
Problem dabei: Was ist wenn Client1 vergisst den lock zu entfernen (bzw. speichern zu drücken)? Dann müsste ein Timeout oder so her...
Ansatz 2:
Versionierung der Datensätze. Client1 holt sich das Objekt, welches Version 1 hat. Client2 macht nun seine Änderungen vor Client1 und inkrementiert die Versionsnummer auf 2. Wenn Client1 nun speichern will, wird erkannt dass sich die Version in der zwischenzeit geändert hat (Hibernate -> Rollbackexception oder so).
Problem: Client1 muss dann irgendwie die Daten mergen. Das kann UI technisch wohl recht aufwendig/doof werden.
Ansatz 3:
Pech gehabt: Wer zuletzt speichert gewinnt.
Bisher gefällt mir Ansatz #1 am besten. Aber ich hab das mit dem Timeout noch nicht ganz ausgetüftelt.
Was sagen die Experten hier dazu?! Gibts weitere Vorgehensweisen? Gibt's irgendwo Lesestoff dazu (mir ist das passende Suchwort noch nicht eingefallen)?
Gruß
Alex