Java und zugriff auf Datenbanken

MScalli

Erfahrenes Mitglied
Hi leutz.
Diesmal muss ich gleich2 Fragen stellen, Thema: Java und Datenbanken.
z.Z. benutze ich PostgreSQL

1. Sperren eines Datensatzes
Ich habe eine Maske in die ich die Daten eines Kunden hole(geht natürlich über mehrere Tabellen). Wenn mehrere Leute sich die Daten holen und dann nacheinander Sachen ändern kann natürlich alles mögliche rauskommen.
-Wie kann ich mit Java diesen Satz sperren(auch über mehrere Tabellen)

2. Weiss die Datenbank wer gerade auf sie zugreift und kann ich das mit Java abfragen?
Ein 2ter User will z.B. jetzt auch genau auf den selben Kunden zugreifen.
WIe bekomme ich es hin das abzufragen und z.B. eine Fehlermeldung z bringen 'Datensatz durch anderen User gesperrt'
-Kann ich hier z.B. auch den anderen User irgendwie bekommen!
z.B. 'Datensatz durch user 192.168.... gesperrt' (durch IP oder Rechnernamen)

Jeder Tipp, jedes Beispiel und jeder Link sind herzlich willkommen^^

schon mal vielen Dank an die Leutz die es sich ansehen.

gruss
MScalli
 
Das Zauberwort heißt JDBC. Da gibt es bei Google massig Tutorials. Um sich den Lowlevelkram zu sparen kann man zum einen das JdbcTemplate (Spring) benutzen oder noch abstrakter werden und JPA einsetzen. Ein zu großes Feld um ins Detail zu gehen...

Bei 1. und 2. solltest du aufpassen, dass du da nicht Dinge miteinander vermischt, die eigentlich unterschiedliche Sachen sind. Ein Lock, wie ihn DB Entwickler verstehen hat NICHTS mit einem sperren eines Datensatzes zur Bearbeitung in einer Maske zu tun. Das sind unterschiedliche Dinge, vorallem vom zeitlichen Scope her.

Das Thema wurde übrigens hier schon gut diskutiert: http://www.tutorials.de/forum/enter...ring-co/327108-sperren-eines-datensatzes.html

Gruß
Ollie
 
Der link bringt mir irgendwie nicht viel^^
Wegen den Tutorials.. Ich glaube ich lese gerade das 3..
Werd aber nicht wirklich schlau daraus.

Zu dem Rollback.. setzt man da Commit punkte! läuft das so kann man dann diesen Commit-punkt explizit ansprechen(Namen vergeben).. oder setzt das ALLES zurück bis zum erstellen der Verbindung(weil ich bis jetzt eigentlich die Verbindung einfach aufrecht erhalte da fast jeder klick irgendwie auf die Datenbank zugreift).

zm 2.ten Thema habe ich ehrlich gesagt noch gar nichts gefunden was mich irgendwie weiter bringt..
 
Der link bringt mir irgendwie nicht viel^^
Mein Post aus diesem Thread erläutert recht detailliert, wie ein Sperren eines Datensatzes für eine Maske zu implementieren ist. Ich poste halt Sachen ungern 5 mal ;).

Zu dem Rollback.. setzt man da Commit punkte! läuft das so kann man dann diesen Commit-punkt explizit ansprechen(Namen vergeben).. oder setzt das ALLES zurück bis zum erstellen der Verbindung(weil ich bis jetzt eigentlich die Verbindung einfach aufrecht erhalte da fast jeder klick irgendwie auf die Datenbank zugreift).
Hast du Transaktionen verstanden? Irgendwie offenbarst du mit jeder Rückfrage mehr, dass es an grundsätzlichem Verständnis fehlt. Vielleicht ist das auch der Grund warum du nichts aus den Tutorials ziehen kannst? Wie lang geht das mit dem Verbindung offenhalten gut? Das ist ein Resourceleck allererster Güte.

zm 2.ten Thema habe ich ehrlich gesagt noch gar nichts gefunden was mich irgendwie weiter bringt..
Wie gesagt, das Thema ist nicht über DB Locks zu erschlagen. Und ich mag jetzt nicht wirklich den Hinweis auf den anderen Thread ein drittes mal bringen...

Gruß
Ollie
 
dieser Satz..
--> Irgendwie offenbarst du mit jeder Rückfrage mehr, dass es an grundsätzlichem Verständnis fehlt

trifft es ziemlich genau ;)

Wie gesagt versuche ich mir bisschen wissen anzueignen indem ich schon paar tuts darüber gelesen habe, leider finde ich nicht das was ich brauche.. kann natürlich auch sein das ich es nicht verstehe. Mit datenbanken arbeite ich zwar schon länger, aber bis jetzt passe ich halt noch nicht darauf auf ob z.B. andere denselben Satz auch im zugriff haben.

Dank dir Trotzdem das es dir durchgelesen hast..

Evtl. kann mir jemand anderst ein tutorial empfehlen zu diesen Themen. Wenns geht mit guten EINFACHEN erklärungen.

Sry.. ist neuland für mich. Bis jetzt setzte ich einfach nur SQL-Befehle ab und das wars auch schon^^
 
Dann schau dir doch als erstes mal das Thema Transaktionen, Isolation Levels usw. an. Eine Datenbanken Vorlesung wird dir hier sicher niemand halten können. :)

Gruß
Ollie
 
Ich glaub für die Transaktionen habe ich was gefunden.. da kann man also doch einen punkt setzen mit con.setSavepoint() und dann den rollback machen falls es eine Exception gibt.
Das würde gehen. Nehm ich mal an. Muss ich testen..

Nur zu dem Thema sperren häng ich bisschen in der luft..

eigentlich will/sollte ich es so machen.
Ein Kunden-Satz(z.B. 4711) wird geholt und die Daten zum verändern in meiner Maske angezeigt. Bis ich jetzt diesen Kunden '4711' nicht zurück Speichere darf eigentlich kein anderer darauf zugreifen. Zumindest nicht mit schreib rechten.
Heisst beim lesen müsst ich diesen Satz sperren und beim Speichern wieder frei geben.. geht das
:confused:

OK.. mit 'for update nowait' wenn ich das recht verstanden habe.. aber wie gebe ich den dann wieder frei oder geht das dann von selber nach dem speichern
 
Zuletzt bearbeitet:
Richtig. Dein Datenmodell sollte das dann explizit unterstützen. D.h. es gibt einen Vorgang "holeZum Editieren" der in dem zu editierenden Objekt den User ablegt, der es gerade editieren will. Ruft ein anderer User diesen Vorgang auf, sollte die Anwendung über dieses Feld mitbekommen, dass der Datensatz in Bearbeitung ist und dem zweiten User halt eine entsprechende Meldung anzeigen.

Sowas zieht sich allerdings durch alle Anwednungsschichten und muss händisch implementiert werden.

Zu den Savepoints. Soweit ich weiß unterstützen die nicht alle Datenbanken. Für dein Problem reicht es aber aus, mit normalen, kompletten Transaktionen zu arbeiten.
 
Zurück