Otrzymuję ten błąd "ora-00060 wykryty podczas oczekiwania na zasoby" często w mojej aplikacji, gdy wielu użytkowników korzysta z aplikacji. Mam plik śledzenia od administratora wyroczni, ale potrzebuję pomocy w jego odczytaniu. Poniżej znajdują się fragmenty danych z pliku śledzenia, które, mam nadzieję, pomogłyby w zlokalizowaniu przyczyny.Znalezienie przyczyny błędu zakleszczenia z pliku śledzenia oracle
*** 2013-06-25 09:37:35.324
DEADLOCK DETECTED (ORA-00060)
[Transaction Deadlock]
The following deadlock is not an ORACLE error. It is a deadlock due
to user error in the design of an application
or from issuing incorrect ad-hoc SQL. The following
information may aid in determining the deadlock:
Deadlock graph:
---------Blocker(s)-------- ---------Waiter(s)---------
Resource Name process session holds waits process session holds waits
TM-000151a2-00000000 210 72 SX SSX 208 24 SX SSX
TM-000151a2-00000000 208 24 SX SSX 210 72 SX SSX
session 72: DID 0001-00D2-000000C6 session 24: DID 0001-00D0-00000043
session 24: DID 0001-00D0-00000043 session 72: DID 0001-00D2-000000C6
Rows waited on:
Session 72: no row
Session 24: no row
----- Information for the OTHER waiting sessions -----
Session 24:
sid: 24 ser: 45245 audsid: 31660323 user: 90/USER
flags: (0x45) USR/- flags_idl: (0x1) BSY/-/-/-/-/-
flags2: (0x40009) -/-/INC
pid: 208 O/S info: user: zgrid, term: UNKNOWN, ospid: 2439
image: [email protected]
client details:
O/S info: user: , term: , ospid: 1234
machine: xyz.local program:
current SQL:
delete from EMPLOYEE where EMP_ID=:1
----- End of information for the OTHER waiting sessions -----
Information for THIS session:
----- Current SQL Statement for this session (sql_id=dyfg1wd8xa9qt) -----
delete from EMPLOYEE where EMP_ID=:1
===================================================
Byłbym wdzięczny, gdyby ktoś mógł mi powiedzieć, co mówi "Zakleszczenie wykresu ::". Również wiersze oczekujące w sekcji nie zawierają wierszy.
Czytałem również na niektórych blogach, że sekcja "sqltxt" z pliku śledzenia może zasugerować przyczynę. Poniżej znajduje się zapytanie, które widzę w tej sekcji.
select /*+ all_rows */ count(1) from "USERS"."EMPLOYEE_SALARY" where EMPSAL_EMP_ID=:1
Tabela employee_salary zawiera ograniczenie obcości w kolumnie EMPSAL_EMP_ID.
Wskazówka sql mówi "all_rows", więc czy to oznacza, że ta tabela pobiera blokadę poziomu tabeli podczas kasowania rekordów z tabeli pracowników? Obecnie nie mam indeksu na kolumnie klucza obcego. Czy dodanie indeksu do tej kolumny pomogłoby?
Uprzejmie post, na wypadek, gdyby potrzebne były dodatkowe informacje.
Dzięki
Dobry temat trybów blokowania w Oracle: http://www.soug.ch/fileadmin/user_upload/Newsletter/NL_public/NL_2013_1_Award_Article.pdf Wygląda na to, że pominięto indeks w kolumnie "USERS.EMPLOYEE_SALARY.EMPSAL_EMP_ID" i obce ograniczenia z 'przy kasowaniu kaskadowym'. – ThinkJet
Wygląda na to, że masz dwie sesje próbujące usunąć ten sam wiersz. – haki