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).
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.
Wenn ich stattdessen so frage:
%Vor%alles funktioniert gut.
Aber jetzt bekomme ich gelegentlich Deadlock-Ausnahmen, wenn mehrere Prozesse diese Abfrage gleichzeitig ausführen.
Gibt es eine Möglichkeit, die Abfrage FOR UPDATE
zu formulieren, ohne einen Ort einzuführen, an dem ein Deadlock auftreten kann?
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.
Tags und Links db2 database-deadlocks