Kursory FOR UPDATE

Autor: Marcin Kasiński
21.01.2011 13:24:00 +0200

Za pomocą kursora z opcją FOR UPDATE mamy możliwość blokowania wierszy w tabeli aby mieć pewność, że się nie zmienią przed wykonaniem poleceń update, czy też delete. W przypadku deklaracji takiego kursora wszystkie jego wiersze są blokowane kiedy otwieramy kursor (nie w przypadku pobrania danych instrukcją FETCH). W związku z czym nie możemy używać instrukcji FETCH po zatwierdzeniu transakcji lub jej wycofaniu. Najczęściej tego typu kursor jest stosowany w przypadku instrukcji UPDATE bądż DELETE z sentencją CURRENT OF. Mozliwa jest tu również opcja NOWAIT oznaczająca, że system nie będzie czekał na odblokowanie rekordów, jeśli będa one zablokowanie przez innego uzytkownika. W takiej sytuacji nastapi powrót do programu i innych zadań a następnie kolejna próba sprawdzenia blokady.

Klauzula kursora FOR UPDATE posiada jesze swoją odmianę FOR UPDATE OF. Ta forma jest stosowana w przypadku kursora definiującego zapytanie z połączonymi tabelami, gdzie po zwrocie FOR UPDATE OF podajemy nazwę kolumny z jednej z połączonych tabel, co będzie oznaczało, że nastapi blokada tylko wierszy z tej tabeli. Wiersze pozostałych tabel biorących udział w złączeniu nie będą blokowane.

Przykład:

DECLARE
Cursor c1 IS select col1 from tab1 FOR UPDATE;
...
BEGIN
OPEN c1;
LOOP
FETCH c1 INTO ...
UPDATE tab1 SET cols1=newvalue WHERE CURRENT OF c1;
END LOOP;

powrót
Zachęcam do przedstawienia swoich uwag i opinii w polu komentarzy.

Komentarze

Dodaj Komentarz