Wie mache ich eine sichere SELECT FOR UPDATE-Anweisung mit einer WHERE-Bedingung für mehrere Tabellen auf einem DB2?
Auf einem DB2 (Version 9.5) die SQL-Anweisung
SELECT o.Id FROM Table1 o, Table2 x WHERE [...] FOR UPDATE WITH RR
gibt mir die FehlermeldungSQLSTATE=42829
(Die FOR UPDATE-Klausel ist nicht zulässig, da die vom Cursor angegebene Tabelle nicht geändert werden kann.)
Ich muss @ angebWITH RR
, weil ich auf Isolationsstufe laufeREAD_COMMITTED
, aber ich muss meine Abfrage blockieren, während ein anderer Prozess dieselbe Abfrage ausführt.
Wenn ich stattdessen so frage:
SELECT t.Id FROM Table t WHERE t.Id IN (
SELECT o.Id FROM Table1 o, Table2 x WHERE [...]
) FOR UPDATE WITH RR
alles funktioniert gut.
Neues ProblemAber jetzt erhalte ich gelegentlich Deadlock-Ausnahmen, wenn diese Abfrage von mehreren Prozessen gleichzeitig ausgeführt wird.
Frag Gibt es eine Möglichkeit, das @ zu formuliereFOR UPDATE
Abfrage ohne Angabe einer Stelle, an der ein Deadlock auftreten kann?