Forum
Hallo,
wenn eine Row geändert werden soll, so sollte grundsätzlich bereits beim Lesen ein höherwertiger Lock verwendet werden (U- oder X).
Das kann erreicht werden, indem beim Lesen die FOR UPDATE- Clause verwendet wird, dadurch werden U-Locks benutzt. Allerdings isolieren sich damit nur die Transaktionen, die parallel mit FOR UPDATE die gleiche Row lesen. Einfache Selects sind weiterhin möglich, da die Row ja hier noch konsistent ist. Sollen sämtliche Lesezugriffe auf diese Row verhindert werden, so ist das über die Klausel WITH RR USE AND KEEP EXCLUSIVE LOCKS möglich. Dann wird die Row bereits beim Lesen mit einem X-Lock gesperrt. Wenn es in der Transaktion/Programm häufig oder sogar immer zu einem Update/Delete kommt ist das sogar besser, da dann keine Lock-Promotion von U nach X notwendig ist.
Wie schon gesagt wurde gibt es aber keine Möglichkeit über eine vorhandene Sperre informiert zu werden. Wenn ein SQL auf eine gesperrte Row trifft, so kommt es zur Lock-Suspension, d. h. es wird gewartet bis die vorhandene Sperre aufgehoben wird (Commit). Falls das nicht in einer im DB2 definierten Zeit passiert, kommt es zu einem TIMEOUT (-911 oder -913).
MfG Rolf