Oracle Error ORA-60 은 서로 다른 세션이 서로 Lock 을 걸고 서로 상대가 풀어주기만을 무한히 기다리는 경우, 즉 Deadlock 상황에서 발생하는 에러입니다.
아래의 예를 보면, 쉽게 이해할 수 있습니다.
왼쪽 세션에서 먼저 job = 'CLERK' 인 데이터를 Update 했습니다.
그리고, 오른쪽 세션에서 job = 'SALESMAN' 인 데이터를 Update 했습니다.
Update 하고 둘다 아직 Commit 을 하지 않았기 때문에 각각 해당 데이터들을 Lock 을 걸고 있는 상황입니다.
다시 왼쪽 세션에서 job = 'SALESMAN' 인 데이터를 Delete 하고자 합니다.
하지만 해당 데이터는 오른쪽 세션에서 Lock 걸고 있는 상태라 Waiting 하게 됩니다.
이때, 오른쪽 세션에서 job = 'CLERK' 인 데이터를 Delete 하고자 합니다.
하지만, 이 데이터들은 왼쪽 세션에서 이미 Lock 을 잡고 있고, 이 왼쪽 세션이 Lock 을 풀으려면, 오른쪽 세션이 작업이 끝나야 하는 상황입니다.
자기가 잡은 Lock 때문에 상대편에서 Lock 을 못풀고 있는줄 모르고, 서로 상대편이 Lock 을 풀어주기만을 영원히 기다리는 상황이 발생했습니다.
이런 상황이 되면, 오라클은 바로 Deadlock 상황임을 자동으로 감지하고, ORA-00060 에러를 뱉어냅니다.
만약, 어플리케이션에서 수행중 가끔씩 Deadlock 상황이 발생하고, 어떤 SQL 에서 발생하는지 찾기가 어려운 경우에는 다음의 방법으로 찾을 수 있습니다.
먼저, 오라클 alertlog 파일을 확인합니다.
alertlog 파일을 보면, 아래와 같이 "Deadlock detected" 라는 메시지를 찾을 수 있습니다.
이 메시지 바로 아래에 트레이스 파일(*.trc) 경로가 있습니다.
이 trc 파일을 열어서 보면 어떤 SQL 이 Deadlock 문제를 일으켰는지 확인할 수 있습니다.
trc 파일에서 Deadlock SQL 을 찾으려면 "Current SQL" 이라는 키워드로 검색하면 됩니다.
'IT관련' 카테고리의 다른 글
Jmeter 에서 Oracle Database 연결 사용방법 (무료 부하테스트툴) (0) | 2021.09.14 |
---|---|
오라클 RMAN 블록 손상 (Block Corruption) 복구 (ORA-01578, ORA-01110) (5) | 2021.09.11 |
서버간 passwordless SSH 접속이 잘되는데, Oracle RAC 설치시 에러가 나는 경우 INS-06006, INS-06009, INS-44015, INS-44000 (0) | 2021.07.31 |
Oracle RAC Grid, CRS 설치를 위한 Response File 샘플 템플리트 파일 (0) | 2021.07.09 |
Oracle Database Silent 설치를 위한 Response File 샘플 템플리트 파일 (0) | 2021.07.09 |