# Tabelle für Zeitraum sperren



## GreenLight (22. Jun 2009)

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


----------



## ice-breaker (22. Jun 2009)

soetwas nennt sich Transaktion und ist Feature eines jeden RDBMS 

SELECT ... FOR UPDATE sollte denke ich dafür passen.


----------



## GreenLight (22. Jun 2009)

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


----------



## ice-breaker (22. Jun 2009)

GreenLight hat gesagt.:


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



GreenLight hat gesagt.:


> Mein Fehler war übrigens, dass ich vergessen hatte autocommit auf false zu setzen


also geht es doch?


----------



## HoaX (23. Jun 2009)

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.


----------

