PiotreK
2008-08-13 09:00:07 UTC
Cześć,
I've got an PL/SQL (Oracle) problem.
Mam do napisania procedurę, która wyszukuje dostępny rekord (np. z
polem TAKEN=0), który spełnia także pewne dodatkowe kryteria. Po kolei
sprawdzanych jest 5 różnych zestawów warunków. Jeżeli rekord spełni
warunki - wyciągany jest z niego identyfikator grupy (np.
REC_GROUP_ID). Następnie wszystkie rekordy z tym REC_GROUP_ID są
nadpisywane (UPDATE table_name SET TAKEN=1 WHERE REC_GROUP_ID =
znalezione_rec_group_id) i ładowane do kursora zwracanego aplikacji.
Po testach wydajnościowych wykonanych grinderem wyszło, że te same
grupy rekordów (z tym samym REC_GROUP_ID) są pobierane przez różne
wątki (czyli użytkowników), czemu miała przeciwdziałać flaga TAKEN.
Jak zabezpieczyć dane przed jednoczesnym pobraniem (czyli jak
sprawdzać bieżące dane aktualizowane przez równolegle uruchomioną
procedurę)? Blokada na całej tabeli odpada ze względu na wymagania
wydajnościowe.
Z góry dzięki,
PiotreK
I've got an PL/SQL (Oracle) problem.
Mam do napisania procedurę, która wyszukuje dostępny rekord (np. z
polem TAKEN=0), który spełnia także pewne dodatkowe kryteria. Po kolei
sprawdzanych jest 5 różnych zestawów warunków. Jeżeli rekord spełni
warunki - wyciągany jest z niego identyfikator grupy (np.
REC_GROUP_ID). Następnie wszystkie rekordy z tym REC_GROUP_ID są
nadpisywane (UPDATE table_name SET TAKEN=1 WHERE REC_GROUP_ID =
znalezione_rec_group_id) i ładowane do kursora zwracanego aplikacji.
Po testach wydajnościowych wykonanych grinderem wyszło, że te same
grupy rekordów (z tym samym REC_GROUP_ID) są pobierane przez różne
wątki (czyli użytkowników), czemu miała przeciwdziałać flaga TAKEN.
Jak zabezpieczyć dane przed jednoczesnym pobraniem (czyli jak
sprawdzać bieżące dane aktualizowane przez równolegle uruchomioną
procedurę)? Blokada na całej tabeli odpada ze względu na wymagania
wydajnościowe.
Z góry dzięki,
PiotreK