heute komme ich mal mit einem SQL-Problem zu euch.
Wie ihr vielleicht mitbekommen habt arbeite ich an einem kleine Online Projekt. Ist aber eigentlich irrelevant weil das Problem eigentlich sehr einfach zu beschreiben ist. Jedes Objekt in meiner Simulation hat eine ID. Und ich arbeite gerade an einem Vergabemechanismus für neue IDs.
In meiner PostgreSQL-Datenbank habe ich eine Tabelle "GlobalValues" mit (wie der Name schon sagt ;) ) globalen Variablen. Dort wird die zuletzt vergebene ID (LastObjectID) gespeichert. Will ich nun eine neue ID vergeben lese ich eben diese aus. Vergebe die nächst höhere (also LastObjectID+1) an das Object, und schreibe den neuen Wert in die Datenbank.
Jetzt kann es aber sein, dass zwei Prozesse gleichzeitig ein Objekt erstellen. Also muss ich die Tabelle (oder am besten die Zeile) mit einem Lock sperren. Ich weiß aber nicht genau wie das in SQL funktioniert. Anscheinend kann ich immer nur für eine Transaktion sperren. Ich muss aber in der Transaktion auch auslesen und einen neuen Wert vergeben (ist also eine SELECT und eine UPDATE Aktion).
Zurzeit sieht das so aus:
Code: Alles auswählen
BEGIN WORK;
LOCK TABLE GlobalValues;
SELECT Value FROM "GlobalValues" WHERE Name='LastObjectID';
UPDATE "GlobalValues" SET Value=_Value_+1 WHERE Name='LastObjectID';
COMMIT WORK;"
schonmal danke für die Hilfe,
Halan