Datensatz exklusiv öffnen

Status
Nicht offen für weitere Antworten.

MScalli

Bekanntes Mitglied
Hi leutz.
Ich hab jetzt meine Frage schon anderen Foren gestellt und habe leider keine Antwort erhalten, obwohl ich glaube das genau diese Anforderung eigentlich sehr oft gebraucht wird.

Ich habe es schon in verschiedenen Richtungen probiert, aber ich fang hier einfach mal ganz von vorn an.

Ich habe Daten in einer PosgreSQL-Datenbank und will z.B. einen Artikel 'Exklusiv' öffnen'.
D.h. wenn ein User einen Artikel zum bearbeiten geöffnet hat soll dies kein anderer User machen können.
Ich könnte dies über einen SQL-Befehl zwar locker sperren(connection öffnen, SQL-Befehl 'SELECT .... FOR UPDATE' dann ist dieser Satz bis zum commit der Connection gesperrt) aber wenn zu dieser Zeit ein zweiter user den Datensatz bearbeiten will merkt er nicht das dieser gesperrt ist. Denn java wartet einfach bis der erste User fertig ist und führt danach den befehl des anderen Users aus.. egal wie lange das auch dauert!!

Wie kann ich dieses Problem lösen???
Also User 1 öffnet einen Datensatz 'exklusiv'. Wenn User 2 jetzt diesen Satz öffnen möchte soll er eine Meldung bekommen 'Datensatz wird gerade bearbeitet'

Bitte schaut es euch mal an denn ich verzweifle langsam :(
 
G

Gast2

Gast
Moin,

mach Dich mal bitte mit dem Transaktions-Konzept von Datenbank vertraut ... die meisten Frameworks bieten dazu einiges an ... außer dem lief das (ähnliche) Thema diese Woche schon - such mal im Forum

hand, mogel
 

MScalli

Bekanntes Mitglied
@ mogel - Ich hab mir diesen Thread mehrfach durchgelesen und auch mal das Thema Hibernate angeschaut.. aber ehrlich gesagt ist das ein Thema das ich nicht so hoppla hopp in Griff bekomme.
-> Ich werde mich aber auf jeden Fall damit beschäftigen denn das sieht echt gar net so blöd aus :)

@ Hrtgpdh - GENAU DAS IST ES.
Wenn ein 2ter User auch einen SELECT .. FOR UPDATE NOWAIT absetzt bekommt er(endlich) eine Exception.
Ich habe mich glaub noch nie über eine Exception so gefreut wie heute^^

Ich hoffe nur ich habs richtig verstanden, denn ich habe mir mit
Java:
System.out.println(ex.getErrorCode());
den ErrorCode geholt(war 0) und kann jetzt eigentlich in der Exception abfragen
Java:
if(x.getErrorCode()==0){
   System.out.println("Satz ist gesperrt");
}

Ich hoffe nur 0 ist der richtige ErrorCode da er eigentlich nur aussagt das dieser Satz nicht gesperrt werden kann..
was in meinem Fall ja aussagt das er schon gesperrt ist.
Oder?!?!
 

tfa

Top Contributor
Das musst du wohl in der Dokumentation nachschlagen.
Trotzdem bindest du dich mit dieser Technik an ein bestimmtes DB-Produkt, d.h. ein Wechsel
könnte unnötig kompliziert werden.
Ich würde so eine Funktion im Application-Server programmieren, und nicht mit DB-Locking.
 

RaoulDuke

Bekanntes Mitglied
tfa hat da völlig recht, das eine Sache die nicht in die Datenbank gehört. Das ist Applikationslogik was du hier willst. Mach dir eine Map (auf Threadsicherheit achten), in der du die IDs der gerade zum Bearbeiten geöffneten Artikel speicherst. Will ein User einen Artikel editieren, dann prüfst du ob die ID in der Map ist. Wenn ja, dann gib die Fehlermeldung das der Artikel in Bearbeitung ist, wenn nein dann pack die ID des Artikels den der User bearbeiten will da rein und lass ihn den Artikel bearbeiten. Ist der User mit Bearbeiten fertig, speicher den Artikel und nimm du die ID wieder aus der Map raus.

Das hat den Vorteil, dass man unabhängig von der verwendeten Datenbank und auch generell der Speichertechnik ist. Das kann man z.B. auch gut mit Dummy DAOs testen, ganz ohne eine Datenbank.

Die Lockingmechanismen der Datenbank sollten nur der letzte Rettungsanker für die Datenkonsistenz sein. Man sollte auch niemals Datenbank-Locks benutzen, die sich über längere Zeit hinziehen, sonst hat man schnell ganz doofe Probleme.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F SQLite Datensatz löschen Datenbankprogrammierung 13
B Mit Button einen Datensatz löschen Datenbankprogrammierung 2
S sql query, um bestimten datensatz zu finden Datenbankprogrammierung 33
D MySQL Neuen Datensatz mit "new" anlegen Datenbankprogrammierung 16
E Nur der letzte Datensatz wird in Tabelle geschrieben Datenbankprogrammierung 4
M Serienbrief aus Datensatz Datenbankprogrammierung 2
E Aufzählung liest nur ersten Datensatz Datenbankprogrammierung 14
S SQLite Selectanfrage lieft datensatz aber cursor ist leer Datenbankprogrammierung 2
M Designfrage zu Rows die sich auf einen Datensatz derselben Tabelle beziehen Datenbankprogrammierung 7
A MySQL Datensatz wird nicht richtig gelöscht Datenbankprogrammierung 6
L SQLite fügt nur den ersten Datensatz ein Datenbankprogrammierung 2
C Hibernate Datensatz löschen Datenbankprogrammierung 2
M Access Datensatz beinhaltet ESC-Zeichen Datenbankprogrammierung 3
U Nur den ersten Datensatz löschen wenn mehrere gleiche da sind Datenbankprogrammierung 2
C Gleichzeitiger Zugriff auf Datensatz Datenbankprogrammierung 5
Eldorado MySQL Hibernate - neuen Datensatz einfügen Datenbankprogrammierung 2
Java.getSkill() Datensatz / Tupel automatisch nach xy Tagen / Stunden löschen Datenbankprogrammierung 7
M design issue: datensatz lange locken? Datenbankprogrammierung 10
M Datensatz aus Datenbank löschen Datenbankprogrammierung 6
T Theoriefrage : mehrere User vs gleichen Datensatz Datenbankprogrammierung 4
K Schnelle Methode um zu testen ob Datensatz existiert Datenbankprogrammierung 9
R datenbank - datensatz sucjen Datenbankprogrammierung 4
-MacNuke- Hibernate löscht jeden Datensatz einzeln? Datenbankprogrammierung 12
V Doppelten Datensatz vermeiden? Datenbankprogrammierung 7
S Überprüfen ob Datensatz existiert Datenbankprogrammierung 2
P SQL, nur jeder 5. Datensatz Datenbankprogrammierung 9
B Eingefügter Datensatz erneut abfragen. Datenbankprogrammierung 10
J Anzeige Button gibt immer nur 1. Datensatz aus DB aus Datenbankprogrammierung 8
M Letzter Datensatz mit auslesen(brauch kleinen Tipp) Datenbankprogrammierung 15
N SELECT: Datensatz sperren Datenbankprogrammierung 6
C vorheriegen oder letzten Datensatz Datenbankprogrammierung 2
K ResultSet: Erste Zeile ausgeben, Datensatz in String speiche Datenbankprogrammierung 13
W Nur ein Datensatz wird angezeigt, obwohl mehrere existieren Datenbankprogrammierung 7
C Datensatz einfügen und quittierung Datenbankprogrammierung 31
H letzter Datensatz wird nicht gefunden? Datenbankprogrammierung 6
F suche MySQl-Befehl um Datensatz an Tabellenende zu schreiben Datenbankprogrammierung 2
Davee SQLite SQLite Datenbank lässt sich nicht auf anderen PCs öffnen Datenbankprogrammierung 8
krgewb H2-Datenbank öffnen Datenbankprogrammierung 8
I UCanAccess: Passwortgeschützte DB öffnen Datenbankprogrammierung 2
H HSQLDB Beim öffnen folgender Fehler: ... java.lang.NullPointerException Datenbankprogrammierung 1
m²labs Muss ich wirklich bei jeder Anfrage öffnen/schließen? Datenbankprogrammierung 3
A H2 Datenbank öffnen? Datenbankprogrammierung 2
Helgon H2 Verbindung öffnen/schließen - Dauer, wann, wie lange? Datenbankprogrammierung 2
T Verschlüsselte MS DB öffnen Datenbankprogrammierung 4
S Derby ein zweites mal als Read-only öffnen Datenbankprogrammierung 9
Z Jedesmal die Datenbank öffnen und schließen ? Datenbankprogrammierung 9
T Datei (Blob) mit verknüpfter Software öffnen? Datenbankprogrammierung 4
S TCP Port öffnen Datenbankprogrammierung 6

Ähnliche Java Themen

Neue Themen


Oben