Tabelle für Zeitraum sperren

Status
Nicht offen für weitere Antworten.

GreenLight

Mitglied
Hallo,

ich habe mal eine generelle Frage. Ist es möglich mit Java eine ganze Tabelle vorübergehend und für einen definierten Zeitraum zum Lesen/Schreiben zu locken? (Ich meine Datenbankunabhängig).

Hintergrund:
Anwender A: Select Max(ID) From TableX;
Anwender B: Select Max(ID) From TableX;
Anwender A: result ++;
Anwender B: result ++;
Und dann anschließend beide ein Insert mit dem neuen result. Result ist Primärschlüssel, was also zwangsläufig zu einem Problem führt. Daher wollte ich auf Datenbankebene ab dem ersten Select die Tabelle für alle anderen Nutzer sperren.

Vielen Dank schon einmal im Voraus 😀
 
soetwas nennt sich Transaktion und ist Feature eines jeden RDBMS 😉

SELECT ... FOR UPDATE sollte denke ich dafür passen.
 
mmh, im Prinzip schon.
SELECT FOR UPDATE funktioniert nicht (zumindest nicht bei Derby).

Die Tabelle kann ich hier explizit mit "LOCK TABLE x IN EXLUSIVE MODE" sperren und dann die Transaktion starten. Ich bin mir aber gerade nicht sicher, ob dieses LOCK TABLE - Statement für alle DBMS gleich ausschaut. Weiß das jemand? (beziehungsweise, ich bin überzeugt, dass es jemand weiß - aber verrät es mir jemand)

Mein Fehler war übrigens, dass ich vergessen hatte autocommit auf false zu setzen 😳
 
Die Tabelle kann ich hier explizit mit "LOCK TABLE x IN EXLUSIVE MODE" sperren und dann die Transaktion starten. Ich bin mir aber gerade nicht sicher, ob dieses LOCK TABLE - Statement für alle DBMS gleich ausschaut. Weiß das jemand? (beziehungsweise, ich bin überzeugt, dass es jemand weiß - aber verrät es mir jemand)
also in MySQL ist die Syntax von Lock Tables schonmal anders.

Mein Fehler war übrigens, dass ich vergessen hatte autocommit auf false zu setzen 😳
also geht es doch? 😉
 
Das LOCK-Statement ist überall anders. Nur SELECT .. FOR UPDATE wäre übergreifend, muss aber eben auch von der Datenbank unterstützt werden. Java kann nicht einfach der Datenbank in ihr System funken und Abläufe ändern. Entwerder die DB kanns, oder nicht. Btw würde ich für sowas eine Sequenz verwenden.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben