# SELECT: Datensatz sperren



## nogi (13. Aug 2006)

Hallo,

ich möchte einen Datensatz per 'SELECT MIN(spalte_a) FROM tab' gegen eine weitere SELECT Abfrage sperren.

Beispiel Tabelle tab

spalte_a
1
2
3

1 Verbindung reserviert nach SELECT Abfrage Datensatz 1. Wird, solange Datensatz 1 noch nicht wieder freigegeben wurde, der gleiche SELECT Befehl ausgeführt wird Datensatz 2 gesperrt.

Nun zu meinen Fragen:

Ist es eine Datenbankeinstellung (IBM DB2/Cloudscape)?
Ist es eine JDBC Einstellung (Transaktion / Locking)?

Ich habe schon verschiedene JDBC Einstellungen versucht, haben aber leider nicht zum gewünschten Effekt geführt.

Vielen Dank im voraus

Gruß

NoGi


----------



## AlArenal (13. Aug 2006)

Ein SELECT ist eine Lese-Operation, zu welchem Zweck sollte sie Datensätze sperren können?

Kannst du den Zweck des Ganzen in einem Praxis-Beispiel erläutern?


----------



## nogi (13. Aug 2006)

Ich muss etwas vergleichbares wie eine Kinoticketbestellung nachstellen. Neben Spalte A gibt es mindestens noch Spalte B, Spalte B ist nur gefüllt wenn das 'Ticket' bereits reserviert wurde.

Um diese Vorgabe umzusetzen möchte ich zunächst per SELECT den kleinsten freien Datensatz zurückgebenlassen, sperren und per UPDATE anschließend Spalte B füllen. Es muss verhindert werden, das zwei Benutzer die gleiche freie ID erhalten.

PS: Vielen Dank für die schnelle Reaktion.


----------



## AlArenal (13. Aug 2006)

Handelt es sich um eine Web-Anwendung (also serverseitig), oder eine Client-Anwendung die driekt via JDBC auf die DB zugreift? Was für eine RDBMS wird eingesetzt und ist die DB-Struktur fest vorgegeben (nicht von dir veränderbar)?


----------



## nogi (13. Aug 2006)

Es handelt sich um eine Client Applikation mit direktem Zugriff per JDBC auf die Datenbank.
Als RDBMS wird zur Entwicklung eine Cloudscape eingesetzt, produktiv soll die Applikation den auf eine DB2 zugreifen.
Die Struktur ist frei von mir veränderbar.


----------



## AlArenal (13. Aug 2006)

Dann wirf mal die Doku an. In DB2 kannste in SELECTs auch Locks verteilen. Dabei musst du dich mal mit den diversen verfügbaren Lock-Mechanismen auseinandersetzen. Lock Request Clauses gibts glaub ich seit DB2 8.2.

http://publib.boulder.ibm.com/infoc...topic=/com.ibm.db2.udb.doc/admin/r0000879.htm

Ansonsten kannst du ja auch im Falle dessen, dass zwischenzeitlich Änderungen vorgenommen wurden, entsprechend neu selektieren. Da gibts Unmengen von Kniffen und Workaraounds, wobei die beste Alternative immer die sein sollte, Features der DB zu nutzen.


----------



## nogi (13. Aug 2006)

Vielen Dank bin eben die Anleitung kurz überflogen, sieht nach dem aus was ich suche.

Vielen Dank noch einmal 

Gruß

NoGi


----------

