본문 바로가기

IT관련

오라클 ORA-00060 데드락(Deadlock) 에러 확인/조치 방법

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" 이라는 키워드로 검색하면 됩니다.