Wie führe ich ein sicheres "SELECT FOR UPDATE" mit einer WHERE-Bedingung über mehrere Tabellen in einem DB2 aus?

8

Problem

Auf einem DB2 (Version 9.5) die SQL-Anweisung

%Vor%

gibt mir die Fehlermeldung SQLSTATE=42829 (Die FOR UPDATE-Klausel ist nicht erlaubt, da die vom Cursor angegebene Tabelle nicht geändert werden kann).

Zusätzliche Informationen

Ich muss WITH RR angeben, weil ich auf Isolationsstufe READ_COMMITTED laufe, aber ich muss meine Abfrage blockieren, während ein anderer Prozess die gleiche Abfrage ausführt.

Lösung bisher ...

Wenn ich stattdessen so frage:

%Vor%

alles funktioniert gut.

Neues Problem

Aber jetzt bekomme ich gelegentlich Deadlock-Ausnahmen, wenn mehrere Prozesse diese Abfrage gleichzeitig ausführen.

Frage

Gibt es eine Möglichkeit, die Abfrage FOR UPDATE zu formulieren, ohne einen Ort einzuführen, an dem ein Deadlock auftreten kann?

    
tangens 07.10.2010, 13:11
quelle

1 Antwort

10

Erstens müssen Sie für die Isolationsstufe READ_COMMITTED nicht WITH RR angeben, da dies zur Isolationsstufe SERIALIZABLE führt. Die Angabe von WITH RS (Lesestabilität) ist ausreichend.

Um FOR UPDATE WITH RS an die innere Auswahl weiterzugeben, müssen Sie zusätzlich USE AND KEEP UPDATE LOCKS angeben.

Die vollständige Anweisung sieht also so aus:

%Vor%

Ich habe einige Tests an einem DB2 über JDBC durchgeführt und es funktionierte ohne Deadlocks.

    
zuserus 12.10.2010, 15:39
quelle

Tags und Links