Das Problem ist die Definition im Select ... for update !

"for update" sperrt bereits beim Lesen, so dass anschließend beliebig viele "Update ... current of" durchgeführt werden können.
Dadurch darf ja der Update den Satz eben nicht freigeben!

Zu beachten ist auch, dass bei Satzsperre bereits der Select einen SQLCOD <> 0 liefert.

Wenn du den "for update" wegläßt und den Update mit Schlüsseln ergänzt erfolgt die Sperre erst beim Update mit anschließender Freigabe (wenn ohne commit, ansonsten erst beim Commit/Rollback).

Du solltest daher auch den SQLCOD nach dem Update prüfen bzw. die Anzahl der betroffenen Sätze.