design issue: datensatz lange locken?

Status
Nicht offen für weitere Antworten.

Mr.Radar

Mitglied
Hi,

folgende Situation: DB postgresql, ORM hibernate.

problem: der user ruft ein panel zum ändern der werte eines datensatzes auf. Da das ganze ein multi client system (1-5 clients ca.) wird, könnte dieser datensatz ja inzwischen geändert worden sein.

frage: wie würdet ihr vorgehen? den datensatz einfach beim aufruf des panels locken, und erst nach klick auf "speichern" oder "abbrechen" (oder nach timeout) wieder freigeben? oder beim klick auf "speichern" den datensatz nochmals aus der db laden und auf unterschiede vergleichen? (einen lastchange-timestamp hätt ich eh in der table drin) oder überhaupt irgendeine andere lösung, auf die ich nicht komme?
 
S

SlaterB

Gast
denkbar ist jedensfalls, nichts lange in der DB blockieren, unnötig offene Transaktionen usw.,
wenn du anderen Teilnehmern eine Blockade mitteilen willst, dann erstelle eine passene Tabelle und lege darin ab, welche Daten seit wann für wie lange für welchen Benutzer aus welchen Grund gesperrt sind,

dann ist das alles nur noch ein Organisationsproblem, hat nichts direkt mit Datenbanken zu tun,
ob man Informationen anderen Usern zur Anzeige oder Änderung vorenthält kann man allgemein doch nicht beantworten,

hier im Forum ist es sicherlich so, dass wenn einer etwas eintippt, auch jemand anders Antworten posten kann oder gar ein Moderator das Thema schließt,
in empfindlicheren Anwendungen kann das ganz anders aussehen ;)
 
M

maki

Gast
optimistic vs. pessemmistic locking, auch als offline Varianten verfügbar ;)

Hibernate bietet von Haus aus Unterstützung für das Optimistic Locking, entweder mit Version oder Datumsfeld.
 

Mr.Radar

Mitglied
stimmt, hibernate kann das - gerade die entsprechenden seiten im wälzer gefunden. Eine frage nur dazu (das buch drückt sich hier undeutlich bzw. JPA/annotations aus): ich verwende ganz normal hibernate, allerdings mit annotations in den POJOs statt den xml-files. Wenn jetzt wegen des lockings ein update fehlschlägt, bekomm ich dann eine StaleObjectStateException oder eine javax.persistence.OptimisticLockException?
 
M

maki

Gast
}enn jetzt wegen des lockings ein update fehlschlägt, bekomm ich dann eine StaleObjectStateException oder eine javax.persistence.OptimisticLockException?
k.A. ehrlich gesagt, aber ein kleiner Unittest sollte dir die Antwort liefern können ;)
 

byte

Top Contributor
Die Hibernate Session wirft eine StaleObjectStateException. Evtl. wirft der EntityManager eine OptimisticLockException, das weiss ich aber nicht.

Eine interessante Alternative bietet hier Spring. Das Spring Framework liefert eine eigene Exception Hierarchie für Persistence-Exceptions unabhängig von der eingesetzten Implementierung: DataAccessException (Spring Framework API 2.5)
 

Mr.Radar

Mitglied
Hm, ich bin in in der Entwicklung schon eher fortgeschritten - eine Implementierung/Portierung auf Spring wäre jetzt wohl zu umständlich.

Naja, werd einfach mal einen unittest machen, und schauen was passiert.
 
M

maki

Gast
Hm, ich bin in in der Entwicklung schon eher fortgeschritten - eine Implementierung/Portierung auf Spring wäre jetzt wohl zu umständlich.

Naja, werd einfach mal einen unittest machen, und schauen was passiert.
Dazu reicht es übrigens die Version manuell zu erhören ;)
 

Mr.Radar

Mitglied
Könnt ihr mir generell irgendeine Literatur/Tutorials/etc. zum junit-testing von hibernate-apps empfehlen? (ist ja IMHO nicht ganz trivial - mocking etc...)
 
M

maki

Gast
Bei kaskadiertem Speichern ist das aber nicht so trivial. Ausserdem kann sich die Version zwischenzeitlich um mehr als 1 erhöht haben.
Schon klar byte, wollte ihm nur einen Denkanstoss geben wie er per Unittest rausfindet, welche Exception genau geworfen wird :)

Könnt ihr mir generell irgendeine Literatur/Tutorials/etc. zum junit-testing von hibernate-apps empfehlen? (ist ja IMHO nicht ganz trivial - mocking etc...)
Ob "Hibernate Apps" oder "EclipseLink Apps" oder sonst eine "JPA App", testen ist fast immer gleich.
Ausser man nutzt Spring, dann wird es viel einfacher ;)
Jedenfalls kann ich für so etwas (RDBMS beteiligt) immer DBUnit empfehlen.
 
Zuletzt bearbeitet von einem Moderator:
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Kirby.exe DB Design Datenbankprogrammierung 0
B Frage zu Datenbank Design bei Events (ZenDesk) Datenbankprogrammierung 1
I Datenbank Design: Internationalisierte Texte -> Bitte um Feedback Datenbankprogrammierung 3
M Grundlegende Klassen-Design Frage Datenbankprogrammierung 0
Spin Datenbank Design Datenbankprogrammierung 6
jeppi MySQL Design-Problem: DB-Verbindung herstellen und halten - JdbcRowSet / Idle-Timeout? Datenbankprogrammierung 9
Antoras Design-Frage: Datenzuordnung zu verschiedenen Accounts Datenbankprogrammierung 2
J DB Verbindung Design Frage Datenbankprogrammierung 5
G gutes design für db-klasse Datenbankprogrammierung 3
E Problem beim Datenbank-Design (relational) Datenbankprogrammierung 10
E falscher Befehl executeQuery() issue data Datenbankprogrammierung 12
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 Datensatz exklusiv öffnen Datenbankprogrammierung 5
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

Ähnliche Java Themen


Oben