2010-06-19 10 views
17

Mam szereg skryptów działających równolegle jako nohup na serwerze AIX hosting Oracle 10g. Te skrypty są pisane przez kogoś innego i mają być wykonywane jednocześnie. Wszystkie skrypty wykonują aktualizacje na stole. Otrzymuję błąd,ORA-00060: zakleszczenia wykryte podczas oczekiwania na zasób

ORA-00060: zakleszczenia wykryte podczas czeka na zasób

Jak google za to znalazłem, http://www.dba-oracle.com/t_deadly_perpetual_embrace_locks.htm

Nawet skrypty wykonują jednoczesne aktualizowanie w tej samej tabeli, wykonują aktualizacje różnych rekordów tabeli określone przez klauzulę WHERE bez nakładania się rekordów między nimi.

Czy spowodowałoby to błąd?

Czy ten błąd się zdarzyć niezależnie od tego, gdzie aktualizacje są wykonywane na stole ?.

powinienem uniknąć jednoczesnych aktualizacji na stole w każdym czasie ?.

Dziwnie znalazłem także w dzienniku nohup.out, PL/SQL successfully completed po powyższym błędzie.

Czy to oznacza, że ​​Oracle został odzyskany z impasu i zakończone sukcesem lub aktualizacje powinienem ponownie uruchomić te skrypty seryjnie? Każda pomoc będzie mile widziane.

Z góry dziękuję.

Odpowiedz

8

Można uzyskać zakleszczenia na więcej niż tylko wiersz zamków, na przykład patrz this. Skrypty mogą konkurować o inne zasoby, takie jak bloki indeksów.

Zrobiłem to w przeszłości przez inżynierię paralelizmu w taki sposób, że różne instancje pracują nad częściami obciążenia, które są mniej prawdopodobne, aby wpływać na bloki, które są blisko siebie; na przykład, aby zaktualizować dużą tabelę, zamiast konfigurowania równoległych urządzeń podrzędnych przy użyciu czegoś takiego jak MOD(n,10), użyłbym TRUNC(n/10), co oznacza, że ​​każdy slave pracował na ciągłym zbiorze danych.

Istnieją, oczywiście, o wiele lepsze sposoby dzielenia się zadanie dla równoległości, np DBMS_PARALLEL_EXECUTE.

Nie wiem, dlaczego otrzymujesz "PL/SQL pomyślnie ukończone", być może Twoje skrypty obsługują wyjątek?

+0

Wielkie dzięki za informacje. – wowrt

+0

Link jest bardzo przydatny! Bardzo proste wyjaśnienie. – CGK

23

Niedawno zmagałem się z podobnym problemem. Okazało się, że w bazie danych brakowało indeksów kluczy obcych. To spowodowało, że Oracle zablokował znacznie więcej rekordów niż było to wymagane, co szybko doprowadziło do zakleszczenia podczas wysokiej współbieżności.

Oto doskonały artykuł z dużą ilością dobrej szczegółowości, sugestie, oraz szczegółowe informacje na temat sposobu rozwiązania impasu: http://www.oratechinfo.co.uk/deadlocks.html#unindex_fk

3

wpadłem na tej kwestii, jak również. Nie znam szczegółów technicznych tego, co się naprawdę działo. Jednakże, in my situation, główną przyczyną było to, że w bazie danych Oracle pojawiły się kaskadowe ustawienia usuwania, a mój kod JPA/Hibernate również próbował wykonywać kaskadowe wywołania kasujące.Więc moja rada polega na upewnieniu się, że wiesz dokładnie, co się dzieje.

Powiązane problemy