Gleichzeitige Zugriffe auf Daten auf dem Server

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:

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.​

*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
 
G

GladstoneGander

Gast
Nimm doch Ansatz 2 und frag den Benutzer, ob er den Datensatz aus der DB überschreiben oder den lokalen Datensatz verwerfen möchte. Der Anwender muss ja selber wissen, wie aktuell bzw. korrekt seine Eingabe ist.
 
T

tuxedo

Gast
Für kleine Datensätze mag das noch "vertretbar" sein. Aber was ist mit einer recht großen Eingabemaske (die auf mehrere Tabs verteilt ist) die vielleicht mehr als nur ein Datenobjekt benötigt?

Beispielsweise sowas (ist nicht meins, nur ein beispiel):



Da wird's dann schwer zu entscheiden was aktuell ist, ohne einen visuell aufbereiteten Datenvergleich anzuzeigen.
 

ARadauer

Top Contributor
Ich hab mal die Version 1 umgesetzt. Mit einem Lock der nur 10 Minuten gültig ist und der Client (so lange er offen ist) den lock alle 5 Minuten erneuert.. Beim lock stand der user name dabei so konnten die anderen User darüber informiert werden wer den da den Datensatz gerade sperrt...
 

Wildcard

Top Contributor
CDO eignet sich dafür hervorragend
CDO Model Repository
Beim CDO Eclipse Editor werden Konflikte und Remote Updates auch direkt im Editor angezeigt (sobald der Konflikt auftritt, nicht erst beim Commit), diese Funktionalität müsstest du bei einer Swing GUI natürlich selbst implementieren, aber da CDO dich per Listener genau über alle Updates/Konflikte informieren kann sollte das nicht schwierig werden. Die EMF Reflection API macht es da Gott sei Dank sehr einfach.
 

FArt

Top Contributor
Ansatz #3 entspricht auf einer DB dem Transaktionsisolationslevel "read commited"... wer zuletzt kommt gewinnt und das ist in der Regel ausreichend und sollte als (einfachster) Ansatz nicht aus den Augen verloren werden.

Sonst würde ich Ansatz #2,5 wählen: eine Versionsüberprüfung, aber ohne Merge... wer so #&%$§! ist und so eine Aktion längere Zeit stehen lässt, bekommt halt einen Fehler und muss noch einmal anfangen. Auch so etwas akzeptieren Benutzer häufiger, als es einem der Fachbereich versucht zu erzählen ;-)
Die Versionsüberprüfung geht einfach über ein extra Feld in der DB, das bei jedem Schreiben (komplette Daten) geändert wird bzw. vor dem Schreiben überprüft wird.
 

ice-breaker

Top Contributor
#2 entspricht ziemlich genau dem Wikipedia-Verhalten, lass den Merge weg und erzähle dem Nutzer einfach, dass die Daten in der Zwischenzeit bereits geändert wurde.
 
T

tuxedo

Gast
Danke für die Antworten.

Ansatz 1 finde ich jetzt nmicht so aufwendig zu implementieren. Und es geht weder etwas verloren, noch besteht die Gefahr dass jemand Daten überschreibt. Nimmt man das Timout allerdings mit hinzu, so ist man teilweise schon bei Ansatz #2

Ansatz 2 finde ich auch nicht soo verkehrt. Allerdings ist das Potential für Ärger etwas größer als beim Ansatz #1

Ansatz 2.5 scheint mir eine Art Kompromiss zwischen Ansatz 1 und 2 zu sein. Den neuen Datensatz kann man im UI ja nochmal zusätzlich anzeigen lassen. Dann kann der User selbst mergen (oder auch nicht). An sich auch nicht schlecht...

Ansatz 3 ist wirklich der einfachste, aber auch der mit dem meisten (zunehmend mit der Anzahl gleichzeitig arbeitender Clients) potential für überschriebene Daten

Werde nochmal die eine oder andere Nacht drüber schlafen bevor ich mich für irgendwas um Ansatz 1-2.5 entscheide. Ansatz 3 werde ich für meinen Fall wohl nicht weiter vertiefen.

Gruß
Alex
 

tuttle64

Bekanntes Mitglied
Werde nochmal die eine oder andere Nacht drüber schlafen bevor ich mich für irgendwas um Ansatz 1-2.5 entscheide. Ansatz 3 werde ich für meinen Fall wohl nicht weiter vertiefen


eine vernünftige db bietet von haus aus isolation resp. lock modi an, um die daten in einer multiuser-umgebung konsistent zu halten. für das problem "stehen lassen" gibt es timeouts. welche db verwendest du?
 
Zuletzt bearbeitet:
M

maki

Gast
So als Suchbegriffe:
Pessemestic Lock, Optimistic Lock, dann noch die Offline variante: Pessimistic Offline Lock

Bei einem Pessemistic (Offline) Lock ist ein Timeout immer nötig.
Generell sind optimistische locks einfacher zu implementieren (JPA bringt schon Unterstützung dafür mit der @Version Annotation), haben aber den Nachteil, dass der User u.U. erst nach umfangreichen Änderungen feststellt dass er eine veraltete Version hatte und diese nicht mehr speichern kann.

Pessemistic Locking wird direkt in der DB umgesetzt (select for update) und ist meist DB spezifisch, die offline Variante ist DB unabhängig, hat aber den Nachteil, dass man mit direktem DB Zugriff Datensätze ändern kann welche die Anwendung als gelockt betrachtet.
 
T

tuxedo

Gast
@tuttle64

PostgreSQL. Und ja, ich weiß, da geht das. Aber ich will den Client bzw. dessen Verhalten nicht an die DB koppeln. Wenn dann muss/soll das einen Layer weiter oben passieren. JPA z.B.
Und da hab ich gerade gesehen dass man eine Entity "locken" kann: Lock Entity : LockJPAJava

Wie ich's nun genau umsetze werd' ich noch sehen. Entweder auf JPA Ebene, oder in einer eigenen Ebene. Aber ich denke JPA könnte hier schon alles notwendige mitbringen.

- Alex
 

FArt

Top Contributor
Eine Transaktion für die Konsistenz der Daten zu verwenden ist prinzipiell der beste Ansatz, schließt sich aber bei deiner Anforderung (Daten werden geholt und liegen u.U. lange rum bevor sie wieder geschrieben werden) praktisch aus:
du hast eine lang laufende Transaktion am Haken (muss eine Usertransaktion sein), da die Transaktion ja holen und schreiben der Daten umschließen muss.

... oder eben Timeouts ...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
V Gleichzeitige Tastendrücke? Allgemeine Java-Themen 10
J Wie die gleichzeitige Ausführung mehrerer Tasks trotz Multithreading verhindern? Allgemeine Java-Themen 2
U Log4j - gleichzeitige geöffnete File handles Allgemeine Java-Themen 2
I Datei zugriffe erkennen Allgemeine Java-Themen 25
M Java-Threads und Datentypen-Zugriffe Allgemeine Java-Themen 7
I Mehrere Klassen mit den selben Daten Allgemeine Java-Themen 5
padde479 Collections Daten in Dreiecksform Allgemeine Java-Themen 13
V Umgang mit fehlenden Daten in einer Java-Datenanalyseanwendung Allgemeine Java-Themen 5
torresbig Url nach Webseiten-Login auslesen & Daten an Webseite senden Allgemeine Java-Themen 9
A Hartgecodete Daten auslagern Allgemeine Java-Themen 4
F Laden von bestimmten Daten aus TAR Archiv Allgemeine Java-Themen 23
S Webservices für binäre Daten? Allgemeine Java-Themen 5
OnDemand Daten in RAM zwischenspeichern oder lieber aus DB holen? Allgemeine Java-Themen 24
J Daten über serielle Schnittstelle empfangen Allgemeine Java-Themen 4
J JSON Daten von einer Webseite erhalten Allgemeine Java-Themen 2
S Entities aus XML - Daten. Allgemeine Java-Themen 1
M Schnelleres Speichern von XML-Daten über URLConnection Allgemeine Java-Themen 4
kodela Klasse mit "gezipten" Daten Allgemeine Java-Themen 6
M Daten aus MatLab Datei lesen Allgemeine Java-Themen 8
N Daten einer JCoTable in JTextArea anzeigen Allgemeine Java-Themen 7
kodela Klassen Klasse "vergisst" ihre Daten Allgemeine Java-Themen 2
C Daten für Klassifikationsverfahren gewinnen Allgemeine Java-Themen 6
J Daten von Quelltext Allgemeine Java-Themen 5
K OOP Daten addieren sich bei GUI-Eingabe Allgemeine Java-Themen 10
J Jasper Reports - Daten vom Hoster Allgemeine Java-Themen 2
kodela Daten während Laufzeit zugriffsbereit Allgemeine Java-Themen 15
J Millisekunde zwischen 2 Daten Allgemeine Java-Themen 6
Q Selbständig ActionEvent auslösen zum Daten senden über serielle Schnittstelle Allgemeine Java-Themen 7
J Daten aus Website-Quelltext auslesen Allgemeine Java-Themen 62
R Android Daten online senden Allgemeine Java-Themen 0
P Datenbank-MiniGUI fügt keine Daten ein Allgemeine Java-Themen 4
K Gespeicherte Daten von einer LinkedList auf vier LinkedList verteilen Allgemeine Java-Themen 6
Q-bert Daten von Java Programm speichern Allgemeine Java-Themen 4
K Datei (CSV-ähnlich) in Java einlesen & mit teil der Daten Graphen erstellen Allgemeine Java-Themen 9
A Erste Schritte Daten aus einer Website auslesen Allgemeine Java-Themen 7
OnDemand Desktop-Applikation schreiben, wie daten persistent? Allgemeine Java-Themen 9
S Erste Schritte Fehlender Gedanken-Ansatz bei Interpretation von Daten Allgemeine Java-Themen 1
J Auslesen Daten Java/HTML Allgemeine Java-Themen 15
K Große Mengen an Daten speichern Allgemeine Java-Themen 9
D Daten in MySQL-Datenbank schreiben Allgemeine Java-Themen 13
A Swing FileWriter schreibt keine Daten in Datei Allgemeine Java-Themen 13
M Daten aus anderen Programmen auslesen Allgemeine Java-Themen 2
D Best Practice Login-Daten: Wie am besten abrufen? Allgemeine Java-Themen 6
L Best Practice Log Dateien analysieren und eventuell passende Daten am Chart darstellen Allgemeine Java-Themen 1
J Serial Port Daten empfangen Allgemeine Java-Themen 5
H Daten via COM Schnittstelle erhalten Allgemeine Java-Themen 2
J Daten persistent speichern Allgemeine Java-Themen 14
S Allgemeine parallelisierte Loesung um Daten im Hintergrund zu laden..? Allgemeine Java-Themen 6
L Daten ohne Datenbank richtig abspeichern Allgemeine Java-Themen 5
G Daten aus Website auslesen Allgemeine Java-Themen 7
J Daten aus GUI auslesen und in Objekte umwandeln Allgemeine Java-Themen 6
O Serial Port Daten als Tastaturanschlag senden Allgemeine Java-Themen 0
N Zeitabstand zwischen 2 Daten(Mehrzahl von Datum) Allgemeine Java-Themen 3
T Input/Output Daten in eine Datei schreiben Allgemeine Java-Themen 4
Z daten bindung Allgemeine Java-Themen 1
A Datentypen Gregorian Calendar - 2 Daten sind gleich?? Allgemeine Java-Themen 3
L Vergleich-Xml-Daten Allgemeine Java-Themen 3
vandread Daten verschlüsseln mit Java oder Datenbank Allgemeine Java-Themen 15
A Daten in Formularen/Vorlagen erstellen und ausdrucken Allgemeine Java-Themen 3
C HtmlUnit Daten einer Tabelle bekommen ohne, dass diese eine ID aufweist Allgemeine Java-Themen 1
T Daten über port abfangen mit proxy server Allgemeine Java-Themen 12
Todesbote Excel Blattschutz aufheben und Daten einfügen Allgemeine Java-Themen 3
T Mit Apache Poi Daten aus einer Excel Tabelle kopieren und in Word einfügen Allgemeine Java-Themen 1
OnDemand PC identifizieren / Daten auslesen Allgemeine Java-Themen 15
G Combobox füllen mit daten aus einer Tabelle Allgemeine Java-Themen 4
J Maven .war enthält veraltete Daten Allgemeine Java-Themen 3
N Daten aus Jar laden Allgemeine Java-Themen 10
P Datentypen String-Daten zu Byte-Zahlen konvertieren - Komme nicht weiter nach vielem versuchen :-/ Allgemeine Java-Themen 7
K Input/Output Daten speichern / laden Allgemeine Java-Themen 2
M Best Practice: Daten aufnehmen-speichern-bereitstellen Allgemeine Java-Themen 8
T Daten effizient verwalten Allgemeine Java-Themen 4
B JTable eigene Daten Add Methode Allgemeine Java-Themen 2
S OOP Apache Commons Math - Verwendung von Genetics - Wie werden Daten in Chromosomen gespeichert? Allgemeine Java-Themen 4
C Daten über URL an PHP verschicken Allgemeine Java-Themen 4
R Daten aus DB auslesen in ein formular (JSP) Allgemeine Java-Themen 13
S Library fuer Internet-Text-Daten-Quellen..? Allgemeine Java-Themen 8
H OOP Daten über TCP Allgemeine Java-Themen 5
H Input/Output Binäre Daten konvertieren, Output hat Zeilenumbrüche?? Allgemeine Java-Themen 9
D Daten eines User auslesen. Allgemeine Java-Themen 5
B Input/Output Einbinden von Daten in Java Allgemeine Java-Themen 3
L Einbinden von Daten in ausführbare Jar Allgemeine Java-Themen 6
N Methoden Einzelne Daten aus "Person" auslesen Allgemeine Java-Themen 3
R SerialPort auslesen und Daten verarbeiten Allgemeine Java-Themen 23
ARadauer Wo liegen die Daten der Preferences Klasse Allgemeine Java-Themen 3
Madlip Erste Schritte Java speichert Daten im Programm?!? Allgemeine Java-Themen 9
S JDialog Daten ins JFrame übergeben Allgemeine Java-Themen 5
F Threads synchronisierung des Zugriffes auf daten Allgemeine Java-Themen 4
O Amazon S3 Anmelden / Daten downloaden Allgemeine Java-Themen 2
A Daten aufbereiten Allgemeine Java-Themen 11
P Daten kopieren mit nio - Zugriff verweigert Allgemeine Java-Themen 8
L Speichern von Daten in JKS Allgemeine Java-Themen 5
K JFreeCharts - Dummy für fehlende Daten Allgemeine Java-Themen 6
M Daten aus doc, pdf .... auslesen Allgemeine Java-Themen 12
Z Daten von einer Klasse in eine andere übertragen Allgemeine Java-Themen 8
A Login-Daten Formular automatisch ausfüllen Allgemeine Java-Themen 10
C Daten speichern und verwalten Allgemeine Java-Themen 3
Z Daten aus einer Internetseite auslesen? Allgemeine Java-Themen 2
E BlueJ Daten in Textdatei schreiben Allgemeine Java-Themen 21
ruutaiokwu META-INF-daten bei ungepackten library-projekten während der entwicklung mit einbeziehen...? Allgemeine Java-Themen 2
K Server Daten Visualisieren Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben