Forum
Hallo Alexander,
im letzten Fall müsstest du den neuen Wert meiner Meinung nach tatsächlich nochmal bekommen.
Ansonsten ist es so, das der Cursor und das Update-Stmt unabhängig voneinander sind. Beim Cursor hängt die Aktualität der Daten tatsächlich davon ab, ob materialisiert wird oder nicht (wobei DB2 immer versucht nicht zu materialisieren). Es wird durch das Locking lediglich sichergestellt, das die Daten zum Zeitupunkt des Zugriffs nicht von einer andereo UoW gesperrt waren (durch X-Lock).
Wenn du immer das gleiche Ergebnis willst sollte Positioned Update statt Searched Update verwendet werden, also Cursor FOR UPDATE deklarieren und UPDATE … WHERE CURRENT OF….
Allerdings ist bei einem FOR UPDATE-Cursor keine ORDER-BY-Clause zulässig.
Und da schliesst sich der Kreis: Die Order-by-Clause ist nicht zulässig, da Materialisierung nicht ausgeschlossen werden kann, bzw. bei Materialisierung nach dem Open alle qualifizierten Rows mit U-Locks gesperrt wären.
Es gibt mittlerweile die Möglichkeit einen Cursor als ASENSITIVE, INSENSITIVE oder SENSITIVE zu deklarieren (s. SQL-Ref., Declare Cursor), das könnte dein Problem lösen. Bitte schau dir das mal an, ich kann dir dazu leider nicht mehr sagen da ich damit noch nicht gearbeitet habe.
MfG Rolf