Zwei SQL-Statements "atomar" ausführen

21/09/2009 - 09:25 von Jürg Danuser | Report spam
Hallo,

Ich verwende eine Tabelle in der Primary-Keys für andere Tabellen
gespeichert sind.

Ich führe folgende SQL-Queries nacheinander aus:

UPDATE KeyTable SET Key = Key + 1
SELECT Key FROM KeyTable

Dadurch erhalte ich immer den nàchst höheren Key.

Nun zu meinem Problem:
Wenn dieser Vorgang von 10-20 Arbeitsstationen gleichzeitig ausgeführt
wird, kann es vorkommen, dass mehrere Arbeitstationen den selben Key
erhalten.

Meine Frage:
Kann ich irgendwie garantieren, dass beide Statements quasi atomar
ausgeführt bevor die Datenbank andere Abfragen bearbeitet?
Oder meine zweite Idee war: Kann ich bei einem Update-Statement
irgendwie einen "Rückgabewert" zurückgeben. Also, dass der Update den
Key um 1 inkrementieren und diesen anschliessend zurückgeben?

Vielen Dank für eure Tipps...

Gruss Jürg
 

Lesen sie die antworten

#1 Peter Fleischer
21/09/2009 - 10:38 | Warnen spam
"Jürg Danuser" schrieb im Newsbeitrag
news:

Ich verwende eine Tabelle in der Primary-Keys für andere Tabellen
gespeichert sind.

Ich führe folgende SQL-Queries nacheinander aus:

UPDATE KeyTable SET Key = Key + 1
SELECT Key FROM KeyTable

Dadurch erhalte ich immer den nàchst höheren Key.

Nun zu meinem Problem:
Wenn dieser Vorgang von 10-20 Arbeitsstationen gleichzeitig ausgeführt
wird, kann es vorkommen, dass mehrere Arbeitstationen den selben Key
erhalten.

Meine Frage:
Kann ich irgendwie garantieren, dass beide Statements quasi atomar
ausgeführt bevor die Datenbank andere Abfragen bearbeitet?
Oder meine zweite Idee war: Kann ich bei einem Update-Statement
irgendwie einen "Rückgabewert" zurückgeben. Also, dass der Update den
Key um 1 inkrementieren und diesen anschliessend zurückgeben?



Hi Jürg,
mal abgesehen davon, dass solch eine Vorgehensweise nicht optimal ist, kann
man die beiden Anweisungen in eine (serialisierende) Transaktion packen.

Das Hauptproblem bei der Nutzung "sprechender Schlüssel" ist die Rückgabe
nicht verbrauchter Schllüsselwerte, wenn eine lückenlose Folge benötigt
wird. Einfacher ist es, eine Technik des Datenbankservers für die Vergabe
von Datensatz-Schlüsseln zu nutzen, z.B. Autowerte und für logische
Schlüsselinformation einen gesonderten Algorithmus entsprechend Vorgabe zu
implementieren. Nutzen kann man dazu ein Datenbankserver-Projekt mit einer
Verwaltung nicht genutzter (rückgegebener) Schlüsselinformation.

Viele Grüsse
Peter

Ähnliche fragen